La construction de l'exécutable jar 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, juste comme ça:
Comment puis-je créer un fichier exécutable JAR avec des dépendances à l'aide de 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 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.
Ici, c'est la pleine pom.xml
, pour 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>
Vous devez vous connecter pour publier un commentaire.
Effectivement, je pense que la réponse donnée dans le question que vous avez mentionné est juste mal (mise à JOUR - 20101106: quelqu'un, il fixe, ce réponse fait référence à la la version précédente de la modifier) et c'est ce qui explique, au moins partiellement, pourquoi vous exécutez dans les ennuis.
Le premier est le POT de la logmanager module généré au cours de la
package
phase parjar:jar
(parce que le module dispose d'un emballage de typejar
). Le second est l'assembly généré parassembly:assembly
et doit contenir les classes du module en cours et de ses dépendances (si vous avez utilisé le descripteur dejar-with-dependencies
).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:
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 decom.gorkwobble.logmanager.LogManager
(c'est ce que l'erreur est de dire, vérifier le contenu de la jarre).Encore une fois, si vous avez configuré l'assemblée plugin comme l'a suggéré, vous avez quelque chose comme ceci:
Avec cette configuration,
logmanager-0.1.0-jar-with-dependencies.jar
contient les classes du module en cours et ses dépendances, mais, en fonction de l'erreur, sonMETA-INF/MANIFEST.MF
n'est pas contenir unMain-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 retirer le
configuration
élément de l'maven-jar-plugin et de configurer le maven-assembly-plugin comme ceci:Bien sûr, remplacer
org.sample.App
avec la classe que vous souhaitez avoir exécuté. Petit bonus, j'ai liéassembly:single
à lapackage
phase de sorte que vous n'avez pas à exécuterassembly:assembly
plus. Il suffit d'exécutermvn install
et de l'assemblée seront produites au cours de la version standard.L'affirmative, veuillez mettre à jour votre pom.xml avec la configuration donnée ci-dessus et lancez
mvn clean install
. Ensuite, insérez le cd detarget
répertoire et essayez de nouveau:Si vous obtenez une erreur, veuillez mettre à jour votre question avec lui et afficher le contenu de la
META-INF/MANIFEST.MF
fichier et la partie pertinente de votrepom.xml
(la configuration des plugins de pièces). Veuillez également d'afficher le résultat de:de 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:
appendAssemblyId
pour de faux, j'ai mes classes doublé dans mon outpu fichier jar! Une idée de comment résoudre ce problème? Je suppose que l'assemblée plugin serait normalement créer un nouveau fichier jar avec "-jar-with-dependencies" suffixe, mais depuis que j'ai arrêté il ajoute les dépendances avec les fichiers de projet dans le bocal (créé avec jar:jar)La réponse de Pascal Thivent m'a aidé, aussi.
Mais si vous gérez vos plugins dans le
<pluginManagement>
élément, vous devez définir l'assemblage de nouveau en dehors de la gestion des plugins, ou bien les dépendances ne sont pas emballés dans le pot si vous exécutezmvn install
.Si vous ne voulez pas exécuter l'assemblée objectif sur l'emballage, vous pouvez utiliser la commande suivante:
Ici paquet est le mot clé.
Cliquez-droit sur le projet et de donner maven build,maven propre,maven pour générer des ressources et de l'installer maven.Le fichier jar générera automatiquement.