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

Je commence 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) pour pouvoir déployer ces deux fichiers. à exécuter de manière autonome. Générer le fichier JAR avec le manifeste approprié est facile, mais je ne sais pas comment faire pour que Maven copie les dépendances du projet en cours dans un répertoire lib que je peux déployer.

Comme il s’agit d’une application Java autonome, je ne suis pas intéressé par le déploiement sur un référentiel Maven, qui est également assez sortingvial, ou du moins facilement utilisable.

J’ai découvert comment tout faire, sauf copier les fichiers JAR dépendants dans un répertoire spécifique. C’est le workflow que je recherche:

 $ mvn clean $ mvn package $ cp -r target/{lib,myApp.jar} installLocation 

Ensuite, exécuter myApp.jar partir de installLocation tant que fichier JAR devrait “fonctionner”, quel que soit mon $CLASSPATH .

Pour essayer de devancer certaines réponses:

  • J’ai une classe principale: ensemble, et ça marche bien.
  • J’ai également défini le classpath dans MANIFEST.MF, et cela fonctionne très bien aussi.
  • J’ai découvert comment utiliser et pour que cela fonctionne, mais uniquement sur ma machine. (via: ${settings.localRepository} )

Ce que vous voulez étudier, c’est le plugin de dépendance de Maven . Ajoutez quelque chose de similaire à ce qui suit à pom.xml:

  org.apache.maven.plugins maven-dependency-plugin   ${project.build.directory}    

Ensuite, exécutez mvn clean dependency:copy-dependencies pour copier effectuer la copie. Combinez cela avec le plug – in Assembly et vous pouvez tout regrouper dans une archive autonome pour la dissortingbution.

Je n’ai pas pris soin du plug-in Shade car il regroupe tous les paquets de tous les pots.

Pour inclure toutes les bibliothèques externes, vous pouvez utiliser le plug-in de dépendance comme mentionné ci-dessus.

Cet exemple créera un répertoire “lib” sous “target / classes” avant la phase “package”.

 
    org.apache.maven.plugins 
    maven-dependency-plugin 
    2.6 
   
     
        copy-dependencies 
        prepare-package 
       
          dépendances de copie 
       
       
          target / classes / lib 
          true 
         
           junit, org.hamcrest, org.mockito, org.powermock, $ {project.groupId}
         
       
     
     
        générer des sources 
       
          sources 
       
     
   
   
      true 
      true 
      $ {project.build.directory} 
   
 

Encore un autre est le plugin appassembler
Ce que j’aime à ce sujet, c’est qu’il compresse l’application sous une forme prête à l’emploi (avec un fichier .bat).

Jetez un coup d’œil au plug-in de dépendance de maven, en particulier à l’objective de dépendance à la copie. La section d’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 

C’est certain Vous devez utiliser le plug-in de nuance qui peut être fait en ajoutant

   org.apache.maven.plugins maven-shade-plugin 1.3-SNAPSHOT     

à votre projet.

En utilisant maven.repo.local, vous pouvez collecter tous les fichiers JAR , mais ils sont collecté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/