Question

J'essaie de générer un fichier jar exécutable pour un petit projet de maison appelé & "logmanager &"; en utilisant Maven, juste comme ça:

Comment créer un fichier JAR exécutable avec des dépendances utilisant Maven?

J'ai ajouté l'extrait de code indiqué ici dans pom.xml et j'ai lancé mvn assembly: assembly. Il génère deux fichiers jar dans logmanager / target: logmanager-0.1.0.jar et logmanager-0.1.0-jar-with-dependencies.jar. Je reçois une erreur lorsque je double-clique sur le premier pot:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.

Une erreur légèrement différente lorsque je double-clique sur le fichier jar-with-dependencies.jar:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar

J'ai copié et collé le chemin d'accès et le nom de la classe, puis vérifié l'orthographe dans le POM. Ma classe principale se lance bien à partir d'une configuration de lancement eclipse. Quelqu'un peut-il m'aider à comprendre pourquoi mon fichier jar ne fonctionne pas? Aussi, pourquoi y a-t-il deux bocaux pour commencer? Faites-moi savoir si vous avez besoin de plus d'informations.

Voici l'intégralité pom.xml, par référence:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gorkwobble</groupId>
  <artifactId>logmanager</artifactId>
  <name>LogManager</name>
  <version>0.1.0</version>
  <description>Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.</description>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.2</version>
            <!-- nothing here -->
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-4</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <archive>
                <manifest>
                  <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
                </manifest>
              </archive>
            </configuration>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- commons-lang -->
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.4</version>
    </dependency> 

    <!-- Quartz scheduler -->
    <dependency>
        <groupId>opensymphony</groupId>
        <artifactId>quartz</artifactId>
        <version>1.6.3</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons collections -->
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.1</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons logging -->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1</version>
    </dependency>
    <!-- Quartz 1.6.0 requires JTA in non J2EE environments -->
    <dependency>
      <groupId>javax.transaction</groupId>
      <artifactId>jta</artifactId>
      <version>1.1</version>
      <scope>runtime</scope>
    </dependency>

    <!-- junitx test assertions -->
    <dependency>
        <groupId>junit-addons</groupId>
        <artifactId>junit-addons</artifactId>
        <version>1.4</version>
        <scope>test</scope>
    </dependency>

    <!-- junit dependency; FIXME: make this a separate POM -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.1</version>
    </dependency>

  </dependencies>
  <dependencyManagement>
  </dependencyManagement>
</project>
Était-ce utile?

La solution

En fait, je pense que la réponse donnée dans la la question que vous avez mentionnée est juste fausse ( MISE À JOUR - 20101106: quelqu'un l'a corrigée, cette réponse fait référence à la version précédant la modification ) et cela explique, au moins partiellement, pourquoi vous rencontrez des problèmes.

  

Il génère deux fichiers jar dans logmanager / target: logmanager-0.1.0.jar et logmanager-0.1.0-jar-with-dependencies.jar.

Le premier est le fichier JAR du module logmanager généré lors de la package phase par jar:jar (car le module a un conditionnement de type jar). Le second est l’assemblage généré par assembly:assembly et doit contenir les classes du module actuel et ses dépendances (si vous avez utilisé le descripteur jar-with-dependencies).

  

Un message d'erreur s'affiche lorsque je double-clique sur le premier pot:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.

Si vous avez appliqué la configuration suggérée du lien posté comme référence, vous avez configuré le plug-in jar pour produire un artefact exécutable, à peu près comme ceci:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

Donc logmanager-0.1.0.jar est bien exécutable mais 1. ce n’est pas ce que vous voulez (car il n’a pas toutes les dépendances) et 2. il ne contient pas com.gorkwobble.logmanager.LogManager (c’est ce que dit l’erreur, cochez le contenu du pot).

  

Une erreur légèrement différente lorsque je double-clique sur le fichier jar-with-dependencies.jar:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar

Encore une fois, si vous avez configuré le plug-in d'assemblage comme suggéré, vous obtenez quelque chose comme ceci:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>

Avec cette configuration, logmanager-0.1.0-jar-with-dependencies.jar contient les classes du module actuel et ses dépendances mais, en fonction de l'erreur, son META-INF/MANIFEST.MF ne ne contient pas Main-Class entrée (probablement pas le même MANIFEST.MF que dans logmanager-0.1.0.jar). Le fichier jar est en réalité non , ce qui n’est pas ce que vous voulez.

Ma suggestion serait donc de supprimer l'élément configuration du maven-jar-plugin et de configurer le maven-assembly-plugin comme suit:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <!-- nothing here -->
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Bien sûr, remplacez org.sample.App par la classe que vous souhaitez faire exécuter. Petit bonus, j'ai lié assembly:single à la phase mvn install afin que vous n'ayez plus à courir mvn clean install. Il suffit d’exécuter target et l’assemblage sera produit lors de la construction standard.

Alors, veuillez mettre à jour votre fichier pom.xml avec la configuration donnée ci-dessus et lancer pom.xml. Ensuite, accédez au répertoire <=> et réessayez:

java -jar logmanager-0.1.0-jar-with-dependencies.jar

Si vous obtenez une erreur, veuillez mettre à jour votre question et publier le contenu du fichier <=> ainsi que la partie correspondante de votre <=> (éléments de configuration des plugins). Aussi, merci de poster le résultat de:

java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager

pour démontrer que tout fonctionne correctement sur la ligne de commande (peu importe ce que dit éclipse).

EDIT: Pour Java 6, vous devez configurer le plug-in maven-compiler. Ajoutez ceci à votre pom.xml:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>

Autres conseils

La réponse de Pascal Thivent m'a également aidée. Mais , si vous gérez vos plug-ins dans l'élément <pluginManagement>, vous devez définir à nouveau l'assembly en dehors de la gestion des plug-ins. Sinon, les dépendances ne sont pas contenues dans le fichier jar si vous exécutez mvn install.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <build>
        <pluginManagement>
            <plugins>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>main.App</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>

        </pluginManagement>

        <plugins> <!-- did NOT work without this  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
            </plugin>
        </plugins>

    </build>


    <dependencies>
       <!--  dependencies commented out to shorten example -->
    </dependencies>

</project>

Si vous ne souhaitez pas exécuter d'objectif d'assemblage sur le package, vous pouvez utiliser la commande suivante:

mvn package assembly:single

Le package est le mot clé.

Cliquez avec le bouton droit de la souris sur le projet et donnez maven build, maven clean, maven générer des ressources et installer maven. Le fichier jar sera généré automatiquement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top