Comment créer un fichier jar avec Maven

Comment créer un fichier jar avec Maven

java jar with maven

Dans ce didacticiel, nous allons vous montrer comment utiliser l'outil de construction Maven, créer un seul fichier Jar exécutable et comment gérer les dépendances du projet.

Les outils utilisés :

  1. Maven 3.1.1

  2. JDK 1.7

  3. log4j 1.2.17

  4. Joda-temps 2.5

  5. Eclipse 4.3

1. Créer un projet Java simple

Créez un projet Java à partir du modèle de démarrage rapide Maven.

$ mvn archetype:generate -DgroupId=com.example.core.utils -DartifactId=dateUtils
 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Les fichiers et la structure de dossiers suivants seront créés.

.
|____dateUtils
| |____pom.xml
| |____src
| | |____main
| | | |____java
| | | | |____com
| | | | | |____example
| | | | | | |____core
| | | | | | | |____utils
| | | | | | | | |____App.java
| | |____test
| | | |____java
| | | | |____com
| | | | | |____example
| | | | | | |____core
| | | | | | | |____utils
| | | | | | | | |____AppTest.java

Au-dessus de la structure des dossiers ne suffit pas, créez un fichierlog4j.properties et placez-le danssrc/main/resources/log4j.properties, créez simplement le dossier de ressources manuellement.

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

Faites-le prendre en charge Eclipse.

$ mvn eclipse:eclipse

Et importe le projet dans Eclipse IDE, la structure finale du projet doit être comme ceci:

maven-create-a-jar

2. Mettre à jour Pom.xml

Mettez à jourpom.xml pour déclarer à la fois les dépendances log4j et jodatime, pour une sortie au formatjar, assurez-vous que l'empaquetage est défini sur «jar». Lisez le commentaire ci-dessous pour plus d'explications.

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. Mettre à jour App.java

Mettez à jour lesApp.java générés avec le contenu suivant:

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();

    }

}

Maintenant, ce projet a deux dépendances: log4j et jodatime.

4. Travailler avec des dépendances

4.1. Comment puis-je ajouter des dépendances dans un fichier jar?

- Vous pouvez mettre à la fois log4j.jar et jodatime.jar dans le fichier final.jar, mais vos classes sont incapables d'appeler d'autres classes qui se trouvent dans le décompresser log4j.jar, Java jar est conçu comme ceci, sauf si vous créez un chargeur de classe spécial comme le plugin one-jar.

- Vous pouvez également utilisermaven-assembly-plugin pour extraire tous les fichiers JAR de dépendances dans des classes brutes et les regrouper. Lisez ceciStackOverflow 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.

- Essayezone-jar plugin, cela créera un fat-jar, qui inclut toutes les dépendances du projet dans un seul fichier jar, lisez cet article -Create a fat Jar file with Maven

4.2 *Solution*
La solution one-jar est vraiment bonne, mais je n’aime pas le concept de chargeur de classe personnalisé et de fat-jar. Ma solution la plus simple et toujours opérationnelle consiste à copier l'ensemble des dépendances du projet dans un dossier prédéfini et à définir le chemin de classe des dépendances dans le fichier manifeste du jar.

Vous trouverez ci-dessous lespom.xml mis à jour et définitifs, pour utilisermaven-dependency-plugin pour copier toutes les dépendances dans le dossiertarget/dependency-jars/, et utilisermaven-jar-plugin pour ajouter le chemin de classe des dépendances.

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

Passez en revue la structure des dossiers dans le dossier cible

maven-create-jar-dependency-jars

Undateutils.jar est créé et toutes les dépendances d'exécution du projet (junit exclu) sont copiées dans le dossiertarget/dependency-jars/.

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.

Vous pouvez toujours transmettre les propriétés log4j via la propriété systèmelog4j.configuration comme ceci:

$ 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
À l'avenir, si vous souhaitez déplacerdateUtils.jar, assurez-vous de copier également son dossierdependency-jars. Si vous avez une meilleure idée, partagez avec moi, merci.

Terminé.

Télécharger le code source

Télécharger -maven-create-a-jar.zip (7 KB)