81 votes

La construction d'un runnable jar avec Maven 2

Je suis relativement nouveau à l'Maven mantra, mais je suis en train de construire une ligne de commande runnable jar avec Maven. J'ai configuré mon dépendances, mais quand je le lance en mvn install et essayez d'exécuter le bocal, deux choses se produisent. Tout d'abord, aucune classe principale est trouvé, ce qui est à corriger. Quand j'ai corrigé cela, j'ai des erreurs sur exécuter en indiquant que les classes ne peuvent pas être trouvés.

Maven n'est pas l'emballage de ma dépendance bibliothèques à l'intérieur du pot, donc je ne suis pas en mesure d'exécuter le pot comme une application autonome. Comment puis-je corriger cela?

111voto

Pascal Thivent Points 295221

La meilleure façon de le faire serait de créer un assemblage à l'aide de l' maven-assembly-plugin et prédéfinis jar-with-dependencies descripteur. Vous aurez également besoin de générer un manifeste avec une main-d'entrée en classe de super jar. L'extrait de code ci-dessous montre comment configurer l'assemblée plugin pour le faire:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
          <manifest>
            <mainClass>fully.qualified.MainClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

Ensuite, pour générer de l'assemblée, il suffit d'exécuter:

mvn assembly:assembly

Si vous voulez produire de l'assemblée dans le cadre de votre construction, il suffit de lier l' assembly:single mojo le package de phase:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
          <manifest>
            <mainClass>fully.qualified.MainClass</mainClass>
          </manifest>
        </archive>
      </configuration>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Et exécutez simplement:

mvn package

25voto

Joachim Sauer Points 133411

Maven n'est pas l'emballage de vos dépendances à l'intérieur de votre fichier jar, parce que vous n'avez pas l'habitude de faire cela avec des programmes Java.

Au lieu de vous livrer les dépendances avec votre fichier jar et de les mentionner dans l' Class-Path - tête du Manifeste.

Aller dans cette voie, vous aurez besoin pour permettre à l' addClasspath de la propriété (documenté ici) pour l' maven-jar-plugin.

Si vous voulez vraiment comprendre tous vos dépendances dans votre fichier jar, vous pouvez utiliser le Maven Assembly plugin pour créer un jar-with-dependencies.

8voto

user2409824 Points 21

C'est ce que je ferais pour les petits projets. La plupart du temps vous ne voulez pas un énorme pot.

pour construire: mvn clean dépendance:la copie des dépendances de package

pour exécuter (dans la cible dir): java -cp myjar.jar:./dépendance/* com.quelque chose.MyClass

6voto

Je suis d'Accord avec Joachim Sauer,

Au lieu d'utiliser jar-with-dépendance, vous devez configurer le jar du plugin comme ça dans votre pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <index>true</index>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>[mainClassFullName]</mainClass>
            </manifest>
            <manifestEntries>
                <mode>development</mode>
                <url>${project.url}</url>
                <key>value</key>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

Et utiliser cette configuration de montage pour ajouter le pot de dépendances à vous de l'assemblée:

<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>zip-with-jars</id>
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySets>
    <dependencySet>
    <outputDirectory>/</outputDirectory>
    <useProjectArtifact>true</useProjectArtifact>
    <unpack>false</unpack>
    <scope>runtime</scope>
    </dependencySet>
</dependencySets>
  </dependencySets>
</assembly>

2voto

Pankaj Points 3

Il suffit d'ajouter le code ci-dessous dans pom.xml et Exécuter en tant qu': maven:installer . Le pot va être créé dans le dossier cible de l'éclipse qui peut être utilisé comme "java-jar Hello.jar" . mais assurez-vous que le nom de la classe principale est donnée com.abc.HelloWorld.java

<build>
<plugins>
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-shade-plugin</artifactid>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalname>HelloW</finalname>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestentries>
<main-class>com.abc.HelloWorld.java</main-class>
<build-number>1</build-number>
</manifestentries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>

</build>

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