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