web-dev-qa-db-fra.com

Maven: Empaqueter les dépendances aux côtés du projet JAR?

J'aimerais que Maven compresse un projet avec ses dépendances d'exécution. Je m'attends à ce qu'il crée un fichier JAR avec le manifeste suivant:

.....
Main-Class : com.acme.MainClass
Class-Path : lib/dependency1.jar lib/dependency2.jar
.....

et créez la structure de répertoires suivante:

target
|-- ....
|-- my-project.jar
|-- lib
    |-- dependency1.jar
    |-- dependency2.jar

Cela signifie que je veux que le JAR principal exclue toutes les dépendances et que toutes les dépendances transitives soient copiées dans un sous-répertoire "lib". Des idées?

45
Gili

J'ai aimé Maven pour empaqueter un projet avec des dépendances d'exécution.

Cette partie n'est pas claire (ce n'est pas exactement ce que vous décrivez juste après). Ma réponse couvre ce que vous avez décrit.

Je m'attends à ce qu'il crée un fichier JAR avec le manifeste suivant (...)

Configurez Maven Jar Plugin pour ce faire (ou plus précisément, Maven Archiver ):

<project>
  ...
  <build>
    <plugins>
      <plugin>
         <artifactId>maven-jar-plugin</artifactId>
         <configuration>
           <archive>
             <manifest>
               <addClasspath>true</addClasspath>
               <classpathPrefix>lib/</classpathPrefix>
               <mainClass>com.acme.MainClass</mainClass>
             </manifest>
           </archive>
         </configuration>
      </plugin>
    </plugins>
  </build>
  ...
  <dependencies>
    <dependency>
      <groupId>dependency1</groupId>
      <artifactId>dependency1</artifactId>
      <version>X.Y</version>
    </dependency>
    <dependency>
      <groupId>dependency2</groupId>
      <artifactId>dependency2</artifactId>
      <version>W.Z</version>
    </dependency>
  </dependencies>
  ...
</project>

Et cela produira un MANIFEST.MF avec les entrées suivantes:

...
Main-Class: fully.qualified.MainClass
Class-Path: lib/dependency1-X.Y.jar lib/dependency2-W.Z.jar
...

et créer la structure de répertoires suivante (...)

Ceci est possible en utilisant Maven Dependency Plugin et dependency:copy-dependencies objectif. De la documentation:

  • dependency:copy-dependencies prend la liste des dépendances directes du projet et éventuellement des dépendances transitives et les copie à un emplacement spécifié, supprimant la version si vous le souhaitez. Cet objectif peut également être exécuté à partir de la ligne de commande.

Vous pouvez le lier sur la phase package:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.1</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/lib</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>false</overWriteSnapshots>
              <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
64
Pascal Thivent

Ajoutez les plugins suivants dans pom.xml. Vérifiez la valeur dans les balises mainClass, classpathPrefix, addClasspath.

<plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>org.Apache.camel.spring.Main</mainClass>
                    <classpathPrefix>lib/</classpathPrefix>
                    <addClasspath>true</addClasspath>
                </manifest>
            </archive>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-Assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <descriptors>
                <descriptor>src/Assembly/some-Assembly.xml</descriptor>
            </descriptors>
        </configuration>
        <executions>
            <execution>
                <id>make-Assembly</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Créez some-Assembly.xml sous src/Assembly comme ci-dessous.

<Assembly
xmlns="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.0 http://maven.Apache.org/xsd/Assembly-1.1.0.xsd">
<id>distribution</id>
<formats>
    <format>Zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
    <fileSet>
        <directory>${project.build.directory}</directory>
        <outputDirectory>/</outputDirectory>
        <includes>
            <include>*.jar</include>
        </includes>
    </fileSet>
</fileSets>
<dependencySets>
    <dependencySet>
        <scope>runtime</scope>
        <outputDirectory>/lib</outputDirectory>
        <useProjectArtifact>false</useProjectArtifact>
        <unpack>false</unpack>
    </dependencySet>
</dependencySets>

Notez que useProjectArtifact flag à false, décompressez flag à false. Si le dossier racine dans le fichier Zip n'est pas requis, alors on peut faire de includeBaseDirectory à false.

Cela créera le fichier name-version-distribution.Zip. Dans le fichier Zip, il y aura le nom du dossier-version. À l'intérieur de ce dossier, votre fichier exécutable et le dossier lib contenant tous les fichiers de dépendance seront présents. Vérifiez le fichier manifest.MF du fichier exécutable. Il contient à la fois des informations sur la classe principale et le chemin de classe.

4
PShetty

Vous pouvez utiliser le plugin maven jar, jetez un œil sur cette page: http://maven.Apache.org/plugins/maven-jar-plugin/examples/manifest-customization.html

0
Skarab