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.
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.
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.
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.
$ 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:
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.