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.
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.
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.
Eindateutils.jar wird erstellt und die gesamten Projektlaufzeitabhängigkeiten (ausgeschlossen junit) werden in den Ordnertarget/dependency-jars/ kopiert.
$ 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.configurationwie folgt übergeben:
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.