web-dev-qa-db-fra.com

Maven peut-il collecter tous les fichiers JAR dépendants d'un projet pour faciliter le déploiement d'applications?

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:

  • J'ai une classe principale: set, et cela fonctionne bien.
  • J'ai également défini le classpath dans MANIFEST.MF, et cela fonctionne également.
  • J'ai découvert comment utiliser <classpathPrefix> et <classpathMavenRepositoryLayout> pour que cela fonctionne - mais uniquement sur ma machine. (via: <classpathPrefix>${settings.localRepository}</classpathPrefix>)
51
rcreswick

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.

81
laz

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> 
9
Gordon Dickens

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

7
Sergey Aldoukhov

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

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.

3
stimms

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/
0
ozma