125 votes

Problème de construction d'un pot exécutable avec Maven

Je suis en train de générer un exécutable jar pour un petit projet de la maison appelée "logmanager" à l'aide de maven, comme cela:

http://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven

J'ai ajouté de l'extrait montré il y à la pom.xml et a couru mvn de l'assemblée:l'assemblée. Il génère deux fichiers jar dans logmanager/cible: logmanager-0.1.0.jar et logmanager-0.1.0-jar-with-dependencies.jar. J'obtiens une erreur lorsque je double-clique sur le premier pot:

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

Un peu différente de d'erreur lorsque je double-cliquez sur l'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, et de vérifier l'orthographe dans le POM. Ma classe principale lance bien à partir d'une éclipse de la configuration de lancement. Quelqu'un peut-il m'aider à comprendre pourquoi mon fichier jar ne fonctionne pas? Aussi, pourquoi il y a deux pots pour commencer? Laissez-moi savoir si vous avez besoin de plus d'informations.

Merci!

[Edit: mon POMPON est maintenant comme suit:]

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

246voto

Pascal Thivent Points 295221

Effectivement, je pense que la réponse donnée à la question que vous avez mentionné est juste mauvais (mise à JOUR - 20101106: quelqu'un fixe, cette réponse fait référence à la version précédente de la modifier) et c'est ce qui explique, au moins partiellement, pourquoi vous avez des problèmes.


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

Le premier est le POT de la logmanager module généré au cours de l' package phase jar:jar (parce que le module dispose d'un emballage de type jar). Le second est l'assembly généré par assembly:assembly et doit contenir les classes du module en cours et de ses dépendances (si vous avez utilisé le descripteur jar-with-dependencies).

J'obtiens une erreur 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 suggestion de configuration du lien posté en référence, vous avez configuré le jar du plugin pour produire un exécutable artefact, quelque chose 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 en effet 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 d' com.gorkwobble.logmanager.LogManager (c'est ce que l'erreur est de dire, vérifier le contenu de la jarre).

Un peu différente de d'erreur lorsque je double-cliquez sur l'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é l'assemblée plugin comme l'a suggéré, vous avez 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 en cours et de ses dépendances, mais, en fonction de l'erreur, son META-INF/MANIFEST.MF ne contiennent Main-Class entrée (de son probablement pas le même MANIFESTE.MF comme dans logmanager-0.1.0.jar). Le pot est en fait pas exécutable, qui encore une fois n'est pas ce que vous voulez.


Donc, ma suggestion serait de supprimer l' configuration élément de l'maven-jar-plugin et de configurer le maven-assembly-plugin comme ceci:

  <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 avec la classe que vous souhaitez avoir exécuté. Petit bonus, j'ai lié assembly:single de la package de phase de sorte que vous n'avez pas à exécuter assembly:assembly plus. Il suffit d'exécuter mvn install et l'assemblée sera produit au cours de la version standard.

Donc, veuillez mettre à jour votre pom.xml avec la configuration donnée ci-dessus et lancez mvn clean install. Ensuite, insérez le cd de target répertoire et essayez à nouveau:

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

Si vous obtenez une erreur, veuillez mettre à jour votre question avec lui et afficher le contenu de l' META-INF/MANIFEST.MF le fichier et la partie pertinente de votre pom.xml (la configuration des plugins de pièces). Veuillez également d'afficher le résultat de:

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

pour démontrer qu'il fonctionne correctement sur la ligne de commande (indépendamment de ce que eclipse est dire).

EDIT: Pour la version 6 de Java, vous devez configurer le maven-compiler-plugin. 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>

16voto

mike Points 1239

Comme ce serait trop long pour un commentaire:

La réponse de Pascal Thivent m'a aussi aidé. Mais si vous gérez vos plugins dans l’élément <pluginManagement> , vous devez définir à nouveau l’assemblage en dehors de la gestion des plugins. Sinon, les dépendances ne sont pas compressées 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>
 

5voto

leonidv Points 587

Si vous ne voulez pas exécuter le but de l’Assemblée sur le paquet, vous pouvez utiliser la commande suivante :

Voici le paquet mot-clé.

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