46 votes

Maven: Des dépendances de packaging aux côtés du projet JAR?

J'aimerais que Maven empaquette un projet avec des 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épertoire suivante:

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

sinon, placez les dépendances dans un sous-répertoire "lib". Des idées?

65voto

Pascal Thivent Points 295221

J'ai comme Maven pour l'emballage d'un projet de dépendances.

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 l'attends pour créer un fichier JAR avec le manifeste suivantes (...)

Configurer Maven Jar du Plugin pour le faire (ou, plus précisément, le Maven Archiveur):

<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 ceci va produire un MANIFESTE.MF avec les entrées suivantes:

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

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

C'est faisable à l'aide de la Dépendance Maven Plugin et l' dependency:copy-dependencies de l'objectif. À partir de la documentation:

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

Vous pouvez lier sur l' package phase de:

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

4voto

PShetty Points 123

Ajouter les plugins suivants dans pom.xml. Vérifier la valeur à mainClass,classpathPrefix,addClasspath balises.

<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éer some-assembly.xml src/assemblée 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 drapeau à false, sortez-la du pavillon de faux. Si le dossier racine de l'intérieur du fichier zip n'est pas nécessaire,on peut faire includeBaseDirectory à false.

Cela va créer name-version-distribution.zip fichier. L'intérieur du fichier zip, il y aura le nom de dossier-version. À l'intérieur de ce dossier, votre exécutable jar et lib dossier contenant toutes les dépendances pots seront présents. Vérifier manifeste.MF fichier de l'exécutable jar. Il contient à la fois classe principale et du chemin de classe de l'information.

0voto

Skarab Points 2261

Vous pouvez utiliser le plugin maven jar, consultez cette page: http://maven.apache.org/plugins/maven-jar-plugin/examples/manifest-customization.html

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