72 votes

Maven 2 assemblée avec des dépendances: pot en vertu de portée "système" de ne pas inclus

Je suis à l'aide de maven-assembly plugin pour créer un jar de mon application, y compris ses dépendances comme suit:

<assembly>
    <id>macosx</id>
    <formats>
       <format>tar.gz</format>
       <format>dir</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <includes>
                <include>*:jar</include>
            </includes>
            <outputDirectory>lib</outputDirectory>
        </dependencySet>
    </dependencySets>
</assembly>

(J'ai omis quelques autres trucs qui n'est pas liée à la question)

Jusqu'à présent cela a bien fonctionné parce qu'il crée une lib répertoire avec toutes les dépendances. Cependant, j'ai récemment ajouté une nouvelle dépendance dont la portée est system, et il ne copie pas à l' lib répertoire de sortie. quelque chose doit m'échapper de base ici, j'ai donc appeler à l'aide.

La dépendance que j'ai juste ajouté est:

<dependency>
  <groupId>sourceforge.jchart2d</groupId>
  <artifactId>jchart2d</artifactId>
  <version>3.1.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath>
</dependency>

La seule façon que j'ai été en mesure d'inclure cette dépendance a été par adjonction de l'élément d'assemblage:

<files>
    <file>
        <source>external/jchart2d-3.1.0.jar</source>
        <outputDirectory>lib</outputDirectory>
    </file>
</files>

Cependant, ce qui m'oblige à changer de pom et de l'assemblée fichier à chaque fois que ce pot est renommé, si jamais. Aussi, il semble tout simplement faux.

J'ai essayé avec <scope>runtime</scope> dans la dependencySets et <include>sourceforge.jchart2d:jchart2d</include> avec pas de chance.

Alors, comment avez-vous inclure un system d'étendue de pot de votre fichier d'assembly dans maven 2?

Merci beaucoup

96voto

Pascal Thivent Points 295221

Je ne suis pas surpris que le système de la portée des dépendances ne sont pas ajoutés (après tout, dépendances avec un système de portée doit être expressément prévu par définition). En fait, si vous ne voulez vraiment pas mettre que de la dépendance dans votre référentiel local (par exemple parce que vous souhaitez le distribuer dans le cadre de votre projet), c'est ce que je ferais:

  • Je mettrais la dépendance dans un "système de fichiers du référentiel" local pour le projet.
  • Je voudrais déclarer que le référentiel dans mon pom.xml comme ceci:

    <repositories>
      <repository>
        <id>my</id>
        <url>file://${basedir}/my-repo</url>
      </repository>
    </repositories>
    
  • Je vient de déclarer l'artefact sans l' system de la portée, c'est juste une source de problèmes:

    <dependency>
      <groupId>sourceforge.jchart2d</groupId>
      <artifactId>jchart2d</artifactId>
      <version>3.1.0</version>
    </dependency>
    

Je ne suis pas 100% sûr que cela va répondre à vos besoins, mais je pense que c'est une meilleure solution que d'utiliser le système de portée.

Mise à jour: je devrais avoir mentionné que, dans l'original de mes réponse et je suis de fixation maintenant. Pour installer une troisième partie de la bibliothèque dans le fichier de la base de référentiel, servez - install:install-file avec l' localRepositoryPath paramètre:

mvn install:install-file -Dfile=<path-to-file> \
                         -DgroupId=<myGroup> \
                         -DartifactId=<myArtifactId> \
                         -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> \
                         -DlocalRepositoryPath=<path-to-my-repo>

Vous pouvez coller ce qu'est un *nix shell. Sur windows, supprimez le "\" et de tout mettre sur une seule ligne.

28voto

alx Points 109

Btw, vous pouvez l'automatiser et de rendre une partie de votre maven build. Suivantes vous permettront d'installer votre pot dans votre référentiel local avant la compilation:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                    <id>hack-binary</id>
                    <phase>validate</phase>
                    <configuration>
                        <file>${basedir}/lib/your-lib.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>your-group</groupId>
                        <artifactId>your-artifact</artifactId>
                        <version>0.1</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

18voto

Mik Points 588

J'ai trouver la solution facile dans le cas où vous la création de jar

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.1.1</version>
  <configuration>
    <webResources>
    <resource>
      <directory>dependencies/mydep</directory>
        <targetPath>WEB-INF/lib</targetPath>
        <filtering>true</filtering>
        <includes>
           <include>**/*.jar</include>
        </includes>
    </resource>
  </webResources>
</configuration>
</plugin>

5voto

khmarbaise Points 28405

Vous pouvez également gérer cela via l'ajout d'un supplément à la dependencySet dans votre dependencySets.

<dependencySet>
  <scope>system</scope>
  <includes>
    <include>*:jar</include>
  </includes>
  <outputDirectory>lib</outputDirectory>
</dependencySet>

La meilleure chose serait d'utiliser un Gestionnaire de Dépôt (comme le Nexus, Artifactory, Archiva) et de l'installation de ce type de dépendance dans un référentiel spécifique. Après cela, vous pouvez utiliser de telles choses comme une simple dépendance. Ceci permettra de simplifier votre vie.

3voto

ykyuen Points 51

Modifié: Désolé que je ne savais pas alx également mentionné sur le propre cycle de vie solution de contournement.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <executions>
        <execution>
            <id>hack-binary</id>
            <phase>clean</phase>
            <configuration>
                <file>${basedir}/lib/your-lib.jar</file>
                <repositoryLayout>default</repositoryLayout>
                <groupId>your-group</groupId>
                <artifactId>your-artifact</artifactId>
                <version>0.1</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Base sur la solution fournie par alx, vous pouvez exécuter le fichier d'installation étape à nettoyer phase. mais puisque le propre de la phase n'est pas par défaut dans le cycle de vie, vous devez exécuter mvn clean à la première fois pour vous assurer le pot est prêt dans le local des pensions.

ex: mvn clean; mvn package

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X