Maven - Comment créer un projet Java

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:

  1. Maven 3.5.3

  2. JDK 8

  3. 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/.

image

P.S Above figure is captured from IntelliJ IDEA, just ignore those .idea folder.

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