Maven - Comment créer un projet Java
Dans ce tutoriel, nous allons vous montrer comment utiliserMaven pour gérer un projet Java - créer, ajouter des dépendances et empaqueter un projet Java dans un fichier jar exécutable. À la fin, nous allons créer un fichier jar exécutable pour hacher une chaîne donnée avec l'algorithme SHA-256.
Technologies utilisées:
-
Maven 3.5.3
-
JDK 8
-
Codec Apache Commons 1.11
1. Créer un projet à partir d'un modèle Maven
Dans un terminal (* uix ou Mac) ou une invite de commande (Windows), accédez au dossier dans lequel vous souhaitez créer le projet Java. Tapez cette commande:
mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} -DarchetypeArtifactId={maven-template} -DinteractiveMode=false
Cela indique à Maven de générer un projet Java à partir d'un modèle Maven. Par exemple,
D:\>mvn archetype:generate -DgroupId=com.example.hashing -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.992 s [INFO] Finished at: 2018-09-27T17:15:57+08:00 [INFO] ------------------------------------------------------------------------
La commande ci-dessus générera un projet Java à partir du modèlemaven-archetype-quickstart
.
2. Disposition du répertoire Maven
La structure de répertoires de projet suivante sera créée. En bref, le code source met dans le dossier/src/main/java/
, le code de test unitaire met dans/src/test/java/
.
P.S Above figure is captured from IntelliJ IDEA, just ignore those .idea
folder.
Note
Lisez ceciMaven
standard directory layout.
3. Fichier POM
Vérifiez lespom.xml
générés. C'est assez vide, juste une seule dépendance jUnit.
pom.xml
4.0.0 com.example.hashing java-project3 jar 1.0-SNAPSHOT java-project http://maven.apache.org junit junit 3.8.1 test
Ce fichier POM est comme le fichier Antbuild.xml
, il décrit toutes les informations du projet, tout de la structure des répertoires, des plugins de projet, des dépendances de projet, comment construire ce projet, etc., lisez ceofficial
POM guide.
4. Mettre à jour le POM
4.1 Add compiler properties to tell Maven use a specified JDK version to compile the source code.
UTF-8 1.8 1.8
4.2 Update jUnit to 4.12
junit junit 4.12 test
4.3 Add commons-codec
for SHA hashing.
commons-codec commons-codec 1.11
4.4 Complete updated version.
pom.xml
4.0.0 com.example.hashing java-project jar 1.0-SNAPSHOT java-project http://maven.apache.org UTF-8 1.8 1.8 junit junit 4.12 test commons-codec commons-codec 1.11
5. Écrire le code
5.1 Update the App.java
to accept an input and hash it with a SHA-256 algorithm.
App.java
package com.example.hashing; import org.apache.commons.codec.digest.DigestUtils; public class App { public static void main(String[] args) { if (args.length < 1) { System.err.println("Please provide an input!"); System.exit(0); } System.out.println(sha256hex(args[0])); } public static String sha256hex(String input) { return DigestUtils.sha256Hex(input); } }
5.2 Unit Test.
AppTest.java
package com.example.hashing; import org.junit.Assert; import org.junit.Test; public class AppTest { private String INPUT = "123456"; @Test public void testLength() { Assert.assertEquals(64, App.sha256hex(INPUT).length()); } @Test public void testHex() { String expected = "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92"; Assert.assertEquals(expected, App.sha256hex(INPUT)); } }
Terminé.
6. Construire Maven
6.1 Let build it with mvn package
D:\java-project>mvn package [INFO] Scanning for projects... [INFO] [INFO] ------------------< com.example.hashing:java-project >------------------- [INFO] Building java-project 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] ...... ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.example.hashing.AppTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.067 sec Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java-project --- [INFO] Building jar: D:\java-project\target\java-project-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.956 s [INFO] Finished at: 2018-09-28T12:40:18+08:00 [INFO] ------------------------------------------------------------------------
Il compile, exécute un test unitaire et conditionne le projet dans un fichierjar
et le place dans le dossierproject/target
.
7. Exécuter # 1
7.1 Run it. Oups ... Par défaut, Maven n'a pas ajouté les dépendances de projetcommons-codec
dans le fichier jar.
D:\java-project>java -cp target/java-project-1.0-SNAPSHOT.jar com.example.hashing.App 123456 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/codec/digest/DigestUtils at com.example.hashing.App.sha256hex(App.java:18) at com.example.hashing.App.main(App.java:13) Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.digest.DigestUtils at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source) at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ... 2 more
7.2 To solve it, we can use this maven-shade-plugin
to create an uber/fat-jar - group everything into a single jar file.
pom.xml
org.apache.maven.plugins maven-shade-plugin 3.2.0 package shade
7.3 Package it again!
D:\java-project>mvn clean package [INFO] Scanning for projects... [... [INFO] --- maven-shade-plugin:3.2.0:shade (default) @ java-project --- [INFO] Including commons-codec:commons-codec:jar:1.11 in the shaded jar. [INFO] Replacing original artifact with shaded artifact. [INFO] Replacing D:\java-project\target\java-project-1.0-SNAPSHOT.jar with D:\java-project\target\java-project-1.0-SNAPSHOT-shaded.jar ...
Deux pots seront générés, vérifiez la taille du fichier:
D:\java-project>dir target Volume in drive D is Samsung970 Volume Serial Number is 10DF-E63D Directory of D:\java-project\target 28/09/2018 12:57 PM 335,643 java-project-1.0-SNAPSHOT.jar 28/09/2018 12:57 PM 3,053 original-java-project-1.0-SNAPSHOT.jar ...
8. Exécuter # 2
8.1 Run it again. Bon, le résultat est attendu.
D:\java-project>java -cp target/java-project-1.0-SNAPSHOT.jar com.example.hashing.App 123456 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
8.2 Can we run it as Jar? Non, il n'y a pas de classe principale.
D:\java-project>java -jar target/java-project-1.0-SNAPSHOT.jar 123456 no main manifest attribute, in target/java-project-1.0-SNAPSHOT.jar
8.3 To solve it, add the main class in maven-shade-plugin
like this.
pom.xml
org.apache.maven.plugins maven-shade-plugin 3.2.0 package shade com.example.hashing.App
9. Exécuter # 3
9.1 Package it again!
D:\java-project>mvn clean package
9.2 Run it as Jar.
D:\java-project>java -jar target/java-project-1.0-SNAPSHOT.jar 123456 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
Terminé.
10. POM
Fichier POM final.
pom.xml
4.0.0 com.example.hashing java-project jar 1.0-SNAPSHOT java-project http://maven.apache.org UTF-8 1.8 1.8 junit junit 4.12 test commons-codec commons-codec 1.11 org.apache.maven.plugins maven-shade-plugin 3.2.0 package shade com.example.hashing.App
Télécharger le code source
$ git clone https://github.com/example/maven-examples.git
$ cd java-project
$ mvn package
$ java -jar target/java-project-1.0-SNAPSHOT.jar 123456