web-dev-qa-db-fra.com

Assemblage Maven 2 avec dépendances: pot sous portée "système" non inclus

J'utilise le plugin maven-Assembly pour créer un pot 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 d'autres choses qui ne sont pas liées à la question)

Jusqu'à présent, cela a bien fonctionné car il crée un répertoire lib avec toutes les dépendances. Cependant, j'ai récemment ajouté une nouvelle dépendance dont la portée est system, et elle ne la copie pas dans le répertoire de sortie lib. je dois manquer quelque chose de basique ici, alors j'appelle à l'aide.

La dépendance que je viens d'ajouter 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 dont j'ai pu inclure cette dépendance était en ajoutant ce qui suit à l'élément Assembly:

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

Cependant, cela m'oblige à changer le pom et le fichier d'assemblage chaque fois que ce pot est renommé, si jamais. En outre, cela semble tout simplement faux.

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

Alors, comment voulez-vous inclure un pot de portée system à votre fichier d'assemblage dans maven 2?

Merci beaucoup

59
YuppieNetworking

Je ne suis pas surpris que les dépendances de portée système ne soient pas ajoutées (après tout, les dépendances avec une portée système doivent être explicitement fournies par définition). En fait, si vous ne voulez vraiment pas mettre cette dépendance dans votre référentiel local (par exemple parce que vous voulez la distribuer dans le cadre de votre projet), voici ce que je ferais:

  • Je mettrais la dépendance dans un "référentiel de système de fichiers" local au projet.
  • Je déclarerais ce référentiel dans mon pom.xml comme ça:

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

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

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

Mise à jour: J'aurais dû le mentionner dans ma réponse d'origine et je le corrige maintenant. Pour installer une bibliothèque tierce dans le référentiel basé sur des fichiers, utilisez install:install-file avec le paramètre localRepositoryPath :

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

Vous pouvez le coller tel quel dans un shell * nix. Sous Windows, supprimez le "\ "et tout mettre sur une seule ligne.

79
Pascal Thivent

Btw vous pouvez l'automatiser et en faire une partie de votre build maven. Les éléments suivants installeront votre jar 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>
25
alx

Je trouve une solution facile au cas où vous créez un pot

<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>
15
mc.dev

Vous pouvez également gérer cela en ajoutant un dependencySet supplémentaire dans vos dependencySets.

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

La meilleure chose serait d'utiliser un gestionnaire de référentiel (comme Nexus, Artifactory, Archiva) et d'installer ce type de dépendance dans un référentiel particulier. Après cela, vous pouvez utiliser des choses comme une simple dépendance. Cela vous simplifiera la vie.

Documents: https://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly.html

5
khmarbaise

Modifié: Désolé de ne pas avoir réalisé qu'Alx a également mentionné la solution de contournement du cycle de vie propre.

<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>

Sur la base de la solution fournie par alx, vous pouvez exécuter l'étape d'installation du fichier lors de la phase de nettoyage. mais comme la phase de nettoyage n'est pas dans le cycle de vie par défaut, vous devez exécuter mvn clean à la première fois pour vous assurer que le pot est prêt dans le dépôt local.

ex: mvn clean; mvn package

2
ykyuen

Une solution simple pour cela est de l'ajouter dans le référentiel maven local

Une façon de le faire est via les commandes d'installation de mvn comme suggéré dans le post précédent.

Un autre moyen simple est, 1) Dans votre idée Eclipse, faites un clic droit sur le projet, sélectionnez l'option Maven. 2) Sélectionnez Installer ou déployer un artefact dans une option de référentiel maven et cliquez sur Suivant. 3) Cliquez sur Parcourir à côté de la case à cocher Fichier d'artefact et sélectionnez votre fichier jar

Cliquez sur terminer, Wallah !!! votre travail est terminé le pot est ajouté dans votre référentiel local que vous pouvez définir dans le répertoire setting.xml ou m2

Maintenant, ajoutez simplement la dépendance maven simple selon la version GroupId, ArtifactId & jar que vous avez entrée lors de l'importation et c'est tout, votre jar externe sera emballé par maven.

2
swapnil thorat

cela a fonctionné plus facilement sur ma solution:

supprimer de votre dépendance:

<dependency>
  <groupId>tiago.medici</groupId>
  <artifactId>eureka</artifactId>
  <version>0.0.1</version>
</dependency> 

Ajoutez ensuite le plugin maven-install-plugin dans le fichier pom.xml.

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-external</id>
      <phase>clean</phase>
      <configuration>
        <file>${basedir}/external/tiago.medici-0.0.1.jar</file>
        <repositoryLayout>default</repositoryLayout>
        <groupId>tiago.medici</groupId>
        <artifactId>eureka</artifactId>
        <version>0.0.1</version>
        <packaging>jar</packaging>
        <generatePom>true</generatePom>
      </configuration>
      <goals>
        <goal>install-file</goal>
      </goals>
    </execution>
  </executions>
</plugin>
1
Tiago Medici