web-dev-qa-db-fra.com

Construire un bocal avec Maven 2

Je suis relativement nouveau dans le mantra Maven, mais j'essaie de créer un fichier java exécutable en ligne de commande avec Maven. J'ai configuré mes dépendances, mais lorsque j'exécute mvn install Et que j'essaie d'exécuter le fichier jar, deux événements se produisent. Tout d'abord, aucune classe principale n'est trouvée, ce qui est corrigible. Quand j'ai corrigé cela, des erreurs s’exécutent indiquant que les classes ne peuvent pas être trouvées.

Maven n'emballe pas mes bibliothèques de dépendances à l'intérieur du fichier jar, je ne peux donc pas exécuter le fichier jar en tant qu'application autonome. Comment puis-je corriger cela?

81
Stefan Kendall

Le moyen le plus simple de procéder consiste à créer un assemblage à l’aide du maven-Assembly-plugin et le prédéfini jar-with-dependencies descripteur. Vous devrez également générer un manifeste avec une entrée de classe principale pour cet uber jar. L'extrait ci-dessous montre comment configurer le plug-in Assembly 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 l’assemblée, lancez simplement:

mvn Assembly:assembly

Si vous souhaitez générer l'assembly dans le cadre de votre construction, liez simplement le Assembly:single mojo à la phase de package:

<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 simplement courir:

mvn package
111
Pascal Thivent

Maven ne compresse pas vos dépendances dans votre fichier jar, car vous ne le faites généralement pas avec les programmes Java.

Au lieu de cela, vous livrez les dépendances avec votre fichier jar et les mentionnez dans le Class-Path _ en-tête du manifeste .

Pour emprunter cette voie, vous devez activer la propriété addClasspath (documentée ici ) pour maven-jar-plugin .

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

25
Joachim Sauer

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

à construire: dépendance mvn clean: paquetage des dépendances de copie

à exécuter ( dans le répertoire cible ): Java -cp myjar.jar :./dependency/* com.something.MyClass

8
user2409824

Je suis d'accord avec Joachim Sauer,

Au lieu d'utiliser jar-with-dependency, vous devriez configurer le plug-in jar comme cela 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 utilisez cette configuration d'Assembly pour ajouter les dépendances de jar à votre Assembly:

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

Ajoutez simplement le code ci-dessous dans pom.xml et Exécuter en tant que: maven: install. Le fichier jar sera créé dans le dossier cible d'Eclipse, qui peut être utilisé comme "Java -jar Hello.jar". mais assurez-vous que le nom de la classe principale est 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>
2
Pan