web-dev-qa-db-fra.com

Intellij Java 2016 & Maven: comment intégrer des dépendances dans JAR?

J'utilise Intellij Java 2016.2.2 et Maven pour créer une application console très simple Java.

Je veux ajouter une bibliothèque externe, donc j'ajoute ma dépendance dans Maven comme ceci:

<dependency>
    <groupId>jline</groupId>
    <artifactId>jline</artifactId>
    <version>2.12</version>
</dependency>

Cela fonctionne très bien quand je l'exécute dans l'EDI, mais pas dans une console externe (j'ai l'erreur suivante: Java.lang.NoClassDefFoundError).

J'ai vérifié et pour une raison quelconque, le JAR externe n'est pas ajouté dans le JAR que je viens de générer. J'ai également essayé beaucoup de choses dans "Fichier -> Structure du projet", mais ne fonctionnait toujours pas ...

Je veux juste construire mon JAR avec mes dépendances, donc je peux simplement exécuter mon application dans une console en utilisant:

Java -jar myproject.jar

Comment puis je faire ça? Merci de votre aide!

16
matteoh

J'ai finalement réussi à générer ce JAR avec Intellij Java, voici comment je fais:

  • ajouter les dépendances dans le fichier pom.xml
  • allez dans Fichier -> Structure du projet -> Artefacts -> Nouveau -> JAR -> Du module avec les dépendances
  • choisissez la classe principale et cliquez sur OK
  • dans votre projet, dans src/main, créez le dossier "resources"
  • déplacer le dossier "META-INF" (avec MANIFEST.MF dedans) dans ce dossier "resources"
  • allez dans Build -> build artefacts pour construire le JAR

MODIFIER

Une méthode plus efficace (et plus simple) consiste à ajouter les lignes suivantes dans le fichier pom.xml:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-Assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>your.MainClass</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-Assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

puis utilisez les commandes maven "clean" et "package".

Les 3 dernières étapes ci-dessus (à propos de MANIFEST.MF) semblent toujours obligatoires.

27
matteoh

D'accord, vous voulez donc créer un "gros pot" (parfois appelé Assembly), qui contient toutes ses propres dépendances (généralement, les dépendances sont externes).

Vous devez utiliser un plugin Maven pour cela. Voici un exemple de configuration du plugin d'assemblage jar-with-dependencies :

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <artifactId>maven-Assembly-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        ...
</project>

puis lancez simplement

mvn package
4
Fabien Benoit-Koch