So erstellen Sie eine JAR-Datei mit Maven
In diesem Tutorial zeigen wir Ihnen, wie Sie mit dem Maven-Build-Tool ein einzelnes ausführbares Jar erstellen und mit den Abhängigkeiten des Projekts umgehen.
Benutztes Werkzeug :
-
Maven 3.1.1
-
JDK 1.7
-
log4j 1.2.17
-
Joda-Zeit 2.5
-
Eclipse 4.3
1. Erstellen Sie ein einfaches Java-Projekt
Erstellen Sie ein Java-Projekt aus der Maven-Schnellstartvorlage.
$ mvn archetype:generate -DgroupId=com.example.core.utils -DartifactId=dateUtils -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Die folgenden Dateien und Ordnerstrukturen werden erstellt.
. |____dateUtils | |____pom.xml | |____src | | |____main | | | |____java | | | | |____com | | | | | |____example | | | | | | |____core | | | | | | | |____utils | | | | | | | | |____App.java | | |____test | | | |____java | | | | |____com | | | | | |____example | | | | | | |____core | | | | | | | |____utils | | | | | | | | |____AppTest.java
Die obige Ordnerstruktur reicht nicht aus. Erstellen Sie einelog4j.properties
-Datei und legen Sie sie insrc/main/resources/log4j.properties
ab. Erstellen Sie den Ressourcenordner einfach manuell.
log4j.properties
# Root logger option log4j.rootLogger=DEBUG, stdout # Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
Lassen Sie es Eclipse unterstützen.
$ mvn eclipse:eclipse
Wenn das Projekt in die Eclipse-IDE importiert wird, sollte die endgültige Projektstruktur folgendermaßen aussehen:
2. Aktualisieren Sie Pom.xml
Aktualisieren Siepom.xml
, um sowohl log4j- als auch jodatime-Abhängigkeiten zu deklarieren. Stellen Sie für die Ausgabe in dasjar
-Format sicher, dass die Verpackung auf "jar" eingestellt ist. Lesen Sie den folgenden Kommentar zur Selbsterklärung.
pom.xml
4.0.0 com.example.core.utils dateUtils jar 1.0-SNAPSHOT dateUtils http://maven.apache.org 1.7 2.5 4.11 1.2.17 junit junit ${junit.version} test joda-time joda-time ${jodatime.version} log4j log4j ${log4j.version} dateutils org.apache.maven.plugins maven-eclipse-plugin 2.9 true false org.apache.maven.plugins maven-compiler-plugin 2.3.2 ${jdk.version} org.apache.maven.plugins maven-jar-plugin **/log4j.properties com.example.core.utils.App
3. Aktualisieren Sie App.java
Aktualisieren Sie die generiertenApp.java
mit dem folgenden Inhalt:
App.java
package com.example.core.utils; import org.apache.log4j.Logger; import org.joda.time.LocalDate; public class App { private static final Logger logger = Logger.getLogger(App.class); public static void main(String[] args) { System.out.println(getLocalCurrentDate()); } private static String getLocalCurrentDate() { if (logger.isDebugEnabled()) { logger.debug("getLocalCurrentDate() is executed!"); } LocalDate date = new LocalDate(); return date.toString(); } }
Dieses Projekt hat jetzt zwei Abhängigkeiten: log4j und jodatime.
4. Arbeiten mit Abhängigkeiten
4.1. Wie kann ich Abhängigkeiten in ein Glas einfügen?
- Sie können sowohl log4j.jar als auch jodatime.jar in die Datei final.jar einfügen. Ihre Klassen können jedoch keine anderen Klassen aufrufen, die sich in der Entpackung log4j.jar befinden. Java jar ist wie folgt konzipiert, es sei denn, Sie erstellen einen speziellen Klassenlader wie Ein-Glas-Plugin.
- Alternativ können Siemaven-assembly-plugin
verwenden, um alle Abhängigkeitsgläser in Rohklassen zu extrahieren und zu gruppieren. Lesen Sie dieseStackOverflow
thread. This hack is workable in project with less dependencies only, for large project with many dependencies, it will cause Java class name conflict issue.
- Versuchen Sieone-jar plugin, es wird ein Fat-Jar erstellt, das die Abhängigkeiten des gesamten Projekts in einer einzigen JAR-Datei enthält. Lesen Sie diesen Artikel -Create a fat Jar file with Maven
4.2 *Solution*
Die Ein-Glas-Lösung ist wirklich gut, aber ich mag das benutzerdefinierte Klassenlader- und Fettglas-Konzept nicht. Meine einfachste und immer funktionierende Lösung besteht darin, die Abhängigkeiten des gesamten Projekts in einen vordefinierten Ordner zu kopieren und den Abhängigkeitsklassenpfad in der Manifestdatei des JAR zu definieren.
Unten finden Sie die aktualisierten und endgültigenpom.xml
, um mitmaven-dependency-plugin
alle Abhängigkeiten in den Ordnertarget/dependency-jars/
zu kopieren und mitmaven-jar-plugin
den Abhängigkeitsklassenpfad hinzuzufügen.
pom.xml
4.0.0 com.example.core.utils dateUtils jar 1.0-SNAPSHOT dateUtils http://maven.apache.org 1.7 2.5 4.11 1.2.17 junit junit ${junit.version} test joda-time joda-time ${jodatime.version} log4j log4j ${log4j.version} dateutils org.apache.maven.plugins maven-eclipse-plugin 2.9 true false org.apache.maven.plugins maven-compiler-plugin 2.3.2 ${jdk.version} org.apache.maven.plugins maven-jar-plugin **/log4j.properties true com.example.core.utils.App dependency-jars/ org.apache.maven.plugins maven-dependency-plugin 2.5.1 copy-dependencies package copy-dependencies runtime ${project.build.directory}/dependency-jars/
5.The final Jar file
5.1 Package the project.
$ mvn package
Überprüfen Sie die Ordnerstruktur im Zielordner
Eindateutils.jar
wird erstellt und die gesamten Projektlaufzeitabhängigkeiten (ausgeschlossen junit) werden in den Ordnertarget/dependency-jars/
kopiert.
5.2 List out the dateutils.jar
content :
$ jar tf target/dateutils.jar META-INF/ META-INF/MANIFEST.MF com/ com/example/ com/example/core/ com/example/core/utils/ com/example/core/utils/App.class META-INF/maven/ META-INF/maven/com.example.core.utils/ META-INF/maven/com.example.core.utils/dateUtils/ META-INF/maven/com.example.core.utils/dateUtils/pom.xml META-INF/maven/com.example.core.utils/dateUtils/pom.properties
5.3 Extracts and review the content of MANIFEST.MF
, the dependencies are added in the Class-Path
.
META_INF/MANIFEST.MF
Manifest-Version: 1.0 Built-By: example Build-Jdk: 1.7.0_05 Class-Path: dependency-jars/joda-time-2.5.jar dependency-jars/log4j-1.2.17.jar Created-By: Apache Maven 3.1.1 Main-Class: com.example.core.utils.App Archiver-Version: Plexus Archiver
5.4 Run it
$ java -jar target/dateutils.jar log4j:WARN No appenders could be found for logger (com.example.core.utils.App). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 2014-10-19
Oppss…
5.5 Where is log4j.properties
?
This is a GOOD practice to exclude the log4j.properties
in the jar file, to avoid issues like multiple log4j.properties
files in classpath.
Sie können die log4j-Eigenschaften weiterhin über die Systemeigenschaftlog4j.configuration
wie folgt übergeben:
$ java -jar -Dlog4j.configuration=file:/full_path/log4j.properties target/dateutils.jar 17:09:15,385 DEBUG App:18 - getLocalCurrentDate() is executed! 2014-10-19
Note
Wenn Sie in ZukunftdateUtils.jar
verschieben möchten, müssen Sie auch den Ordnerdependency-jars
kopieren. Wenn Sie eine bessere Idee haben, teilen Sie sie mir mit, danke.
Erledigt.
Quellcode herunterladen
Herunterladen -maven-create-a-jar.zip (7 KB)