Der Aufbau ausführbare jar mit Maven?
-
06-07-2019 - |
Frage
Ich versuche, eine ausführbare jar für ein kleines home-Projekt namens „logmanager“ mit Maven, wie dies zu generieren:
Wie kann ich eine ausführbare JAR mit Abhängigkeiten mit Maven?
Ich habe die Schnipsel in die pom.xml dort gezeigten und lief mvn assembly: Montage. Er erzeugt zwei JAR-Dateien in logmanager / target: logmanager-0.1.0.jar und logmanager-0.1.0-jar-with-dependencies.jar. Ich erhalte eine Fehlermeldung, wenn ich einen Doppelklick auf dem ersten Glas:
Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.
Eine etwas andere Fehler, wenn ich einen Doppelklick auf das jar-with-dependencies.jar:
Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar
ich kopiert und eingefügt den Pfad und den Klassennamen, und überprüft die Rechtschreibung in der POM. Meine Hauptklasse startet von einer Eklipse Startkonfiguration in Ordnung. Kann mir jemand helfen, herauszufinden, warum meine JAR-Datei nicht ausgeführt werden? Auch, warum gibt es zwei Gläser zu beginnen? Lassen Sie uns wissen, wenn Sie mehr Informationen benötigen.
Hier ist der vollständige pom.xml
, als Referenz:
<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>
Lösung
Eigentlich, denke ich, dass die Antwort in dem Frage erwähnt ist nur falsch ( UPDATE - 20.101.106: jemand es fest, diese Antwort bezieht sich auf die Version vor dem bearbeiten ) und dies erklärt, zumindest teilweise, warum man in Schwierigkeiten läuft.
Es erzeugt zwei JAR-Dateien in logmanager / Ziel:. Logmanager-0.1.0.jar und logmanager-0.1.0-jar-with-dependencies.jar
Die erste ist die JAR des LogManager Modul während der package
Phase durch jar:jar
erzeugt (weil das Modul eine Verpackung vom Typ jar
hat). Die zweite ist die Montage von assembly:assembly
erzeugt und sollte die Klassen aus dem aktuellen Modul und seine Abhängigkeiten enthalten (wenn Sie den Deskriptor jar-with-dependencies
verwendet wird).
Ich erhalte eine Fehlermeldung, wenn ich einen Doppelklick auf dem ersten Glas:
Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.
Wenn Sie die vorgeschlagene Konfiguration des Link gepostet als Referenz angelegt, können Sie die jar-Plugin konfigurierten ein ausführbares Artefakt, um so etwas zu produzieren:
<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>
So logmanager-0.1.0.jar
tatsächlich ausführbar ist aber 1. ist dies nicht das, was Sie wollen (weil es nicht alle Abhängigkeiten hat) und 2. es enthält keine com.gorkwobble.logmanager.LogManager
(das ist, was der Fehler sagt, überprüfen Sie den Inhalt der jar).
Eine etwas andere Fehler, wenn ich einen Doppelklick auf das jar-with-dependencies.jar:
Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar
Noch einmal, wenn Sie die Assembly-Plugin, wie vorgeschlagen konfiguriert, haben Sie so etwas wie folgt aus:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
Mit diesem Setup logmanager-0.1.0-jar-with-dependencies.jar
enthält die Klassen aus dem aktuellen Modul und seine Abhängigkeiten, aber nach dem Fehler, sein META-INF/MANIFEST.MF
nicht enthält einen Main-Class
Eintrag (sein wahrscheinlich nicht das gleiche MANIFEST.MF wie in logmanager-0.1.0.jar). Das Glas ist eigentlich nicht ausführbare Datei, die wiederum ist nicht das, was Sie wollen.
Also, wäre mein Vorschlag, das configuration
Element aus der Maven-jar-Plugin zu entfernen und die Maven-Montage-Plugin wie folgt zu konfigurieren:
<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>
Natürlich ersetzen org.sample.App
mit der Klasse, die Sie ausgeführt haben möchten. Kleiner Bonus habe ich assembly:single
an die package
Phase gebunden, so dass Sie müssen mehr assembly:assembly
nicht laufen. Führen Sie einfach mvn install
und die Montage wird während der Standard-Build hergestellt werden.
So aktualisieren Sie bitte Ihre pom.xml mit der angegebenen Konfiguration, die oben und mvn clean install
läuft. Dann CD in das Verzeichnis target
und versuchen Sie es erneut:
java -jar logmanager-0.1.0-jar-with-dependencies.jar
Wenn Sie eine Fehlermeldung erhalten, aktualisieren Sie bitte Ihre Frage mit ihm und poste den Inhalt der META-INF/MANIFEST.MF
Datei und dem betreffenden Teil Ihrer pom.xml
(die Plugins Konfigurationsteile). Auch bitte poste das Ergebnis:
java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager
zeigen, es funktioniert gut auf der Kommandozeile (unabhängig davon, was Eclipse sagt).
EDIT: Für Java 6, benötigen Sie die Maven-Compiler-Plugin zu konfigurieren. Fügen Sie diese auf Ihre 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>
Andere Tipps
Die Antwort von Pascal Thivent hat mir geholfen, auch.
Aber , wenn Sie Ihre Plugins im <pluginManagement>
element verwalten, müssen Sie außerhalb des Plug-ins Management die Baugruppe wieder definieren, oder auch die Abhängigkeiten werden in dem Glas nicht gepackt, wenn Sie mvn install
ausgeführt werden.
<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>
Wenn Sie nicht ausführen Montag Ziel auf Paket wollen, können Sie die nächsten Befehl:
mvn package assembly:single
Hier Paket ist Schlüsselwort.
Recht das Projekt klicken und Maven Build geben, Maven sauber, Maven erzeugen Ressource und Maven install.The JAR-Datei automatisch generieren.