So erstellen Sie eine Jar-Datei mit Maven

So erstellen Sie eine JAR-Datei mit Maven

java jar with 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 :

  1. Maven 3.1.1

  2. JDK 1.7

  3. log4j 1.2.17

  4. Joda-Zeit 2.5

  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:

maven-create-a-jar

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}
                    ${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}
                    ${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

maven-create-jar-dependency-jars

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.configurationwie 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)