Comment créer un fichier jar avec 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 :
-
Maven 3.1.1
-
JDK 1.7
-
log4j 1.2.17
-
Joda-temps 2.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:
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} 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} 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
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)