31 votes

Maven peut-il rassembler tous les JARs dépendants d'un projet pour faciliter le déploiement de l'application ?

Je commence juste à utiliser Maven (en l'évaluant, vraiment) et je dois pouvoir générer rapidement une JAR pour mon application et un répertoire contenant toutes les dépendances (par exemple, lib) afin que je puisse déployer ces deux éléments pour qu'ils soient exécutés de manière autonome. La génération du 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 de type lib que je peux déployer.

Puisqu'il s'agit d'une application Java autonome, je suis no Si vous êtes intéressé par le déploiement dans un dépôt Maven, c'est également assez trivial, ou du moins facile à trouver sur Google.

J'ai trouvé comment faire tout excepto copier les fichiers JAR dépendants dans un répertoire spécifié. C'est le flux de travail que je recherche :

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

Puis, en courant myApp.jar de installLocation en tant que fichier JAR devrait "fonctionner" sans tenir compte de mon $CLASSPATH .

Pour essayer d'anticiper certaines réponses :

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

52voto

laz Points 12212

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <configuration>
        <outputDirectory>
            ${project.build.directory}
        </outputDirectory>
    </configuration>
</plugin>

Ensuite, exécutez mvn clean dependency:copy-dependencies pour copier effectuer la copie. Combinez cela avec le plugin d'assemblage et vous pouvez tout regrouper dans une archive autonome pour la distribution.

9voto

Amar Points 1396

Jetez un coup d'oeil au plugin de dépendance de maven, spécifiquement le but de copy-dependencies. La section sur l'utilisation décrit comment faire exactement ce que vous voulez.

Pour le faire à partir de la ligne de commande, il suffit de faire :

$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR

5voto

Sergey Aldoukhov Points 8386

Un autre encore est plugin appassembler
Ce que j'aime, c'est qu'il conditionne l'application sous une forme prête à l'emploi (avec un fichier .bat et autres).

4voto

Gordon Dickens Points 319

Je n'ai pas apprécié le plugin Shade car il regroupe tous les paquets de tous les bocaux.

Pour inclure toutes les librairies externes, vous pouvez utiliser le plugin de dépendance comme mentionné ci-dessus.

Cet exemple va créer 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>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>target/classes/lib</outputDirectory>
        <overWriteIfNewer>true</overWriteIfNewer>
        <excludeGroupIds>
          junit,org.hamcrest,org.mockito,org.powermock,${project.groupId}
        </excludeGroupIds>
      </configuration>
    </execution>
    <execution>
      <phase>generate-sources</phase>
      <goals>
        <goal>sources</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <verbose>true</verbose>
    <detail>true</detail>
    <outputDirectory>${project.build.directory}</outputDirectory>
  </configuration>
</plugin>

3voto

stimms Points 14986

C'est sûr. Vous devez utiliser le plugin d'ombrage ce 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X