Je commence tout juste à utiliser Maven , (en l’évaluant vraiment) et je dois pouvoir générer rapidement un fichier JAR pour mon application et un répertoire avec toutes les dépendances (par exemple , lib) afin que je puisse déployer ces deux pour être exécuté de manière autonome. Il est facile de générer le fichier JAR avec le manifeste approprié, mais je ne sais pas comment faire en sorte que Maven copie les dépendances du projet actuel dans un répertoire lib
que je puisse déployer.
Comme il s’agit d’applications Java autonomes, je suis pas intéressé à effectuer un déploiement dans un référentiel Maven, qui est également assez trivial, ou du moins facilement gogleable.
J'ai découvert comment tout faire sauf copier les fichiers JAR dépendants dans un répertoire spécifié. Voici le flux de travail que je recherche:
$ mvn clean
$ mvn package
$ cp -r target/{lib,myApp.jar} installLocation
Ensuite, exécuter myApp.jar
à partir de installLocation
en tant que fichier JAR devrait "fonctionner correctement", quel que soit mon $CLASSPATH
.
Pour essayer de préempter certaines réponses:
<classpathPrefix>
et <classpathMavenRepositoryLayout>
pour que cela fonctionne - mais uniquement sur ma machine. (via: <classpathPrefix>${settings.localRepository}</classpathPrefix>
)Ce que vous voulez étudier est le plugin de dépendance de Maven . Ajoutez quelque chose de similaire à ce qui suit dans pom.xml:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<outputDirectory>
${project.build.directory}
</outputDirectory>
</configuration>
</plugin>
Puis exécutez mvn clean dependency:copy-dependencies
pour copier effectuer la copie. Combinez cela avec le plugin Assembly et vous pourrez tout regrouper dans une archive autonome pour la distribution.
Je me fichais du plugin Shade, car il regroupe tous les paquets de tous les pots.
Pour inclure toutes les bibliothèques externes, vous pouvez utiliser le plugin Dépendance comme mentionné ci-dessus.
Cet exemple créera un répertoire "lib" sous "target/classes" avant la phase "package".
<plugin> <groupId> org.Apache.maven.plugins </ groupId> <artifactId> maven-dependency-plugin </ artifactId> <version> 2.6 </ version> <exécutions> <exécution> <id> dépendances de copie </ id> <phase> prepare-package </ phase> <buts> <goal> dépendances de copie </ goal> </ buts> <configuration> <outputDirectory> target/classes/lib </ outputDirectory> <overWriteIfNewer> true </ overWriteIfNewer> <excludeGroupIds> junit, org.hamcrest, org.mockito, org.powermock, $ {project.groupId} </ excludeGroupIds> </ configuration> </ exécution> <exécution> <phase> generate-sources </ phase> <buts> <goal> sources </ goal> </ buts> </ exécution> </ exécutions> <configuration> <verbose> true </ verbose> <detail> true </ detail> <outputDirectory> $ {project.build.directory} </ outputDirectory> </ configuration> </ plugin>
Encore un autre est plugin appassembler
Ce que j’aime bien, c’est que l’application est conditionnée dans un formulaire prêt à l’emploi (avec un fichier .bat, etc.)
Jetez un coup d'œil au plugin de dépendance de maven, en particulier à l'objectif des dépendances de copie. La section utilisation décrit comment faire exactement ce que vous voulez.
Pour le faire depuis la ligne de commande, faites simplement:
$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR
Cela peut certainement. Vous devez utiliser le plugin shade qui peut être fait en ajoutant
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.3-SNAPSHOT</version>
<configuration>
<!-- put your configurations here -->
</configuration>
</plugin>
à votre projet.
En utilisant maven.repo.local on peut collecter tous les fichiers jar, mais ils sont rassemblés dans un répertoire avec la hiérarchie maven (.m2).
mvn install -Dmaven.repo.local=./pick/some/folder
Vous pouvez ensuite les collecter (sous Linux):
mkdir flat-repo
find ./pick/some/folder -type f -name "*.jar" | xargs -I'{}' cp '{}' flat-repo/