Maven - Как создать проект Java

Maven - Как создать проект Java

В этом руководстве мы покажем вам, как использоватьMaven для управления проектом Java - создать, добавить зависимости и упаковать проект Java в исполняемый файл jar. В конце мы создадим исполняемый файл jar для хеширования заданной строки с помощью алгоритма SHA-256.

Используемые технологии:

  1. Maven 3.5.3

  2. JDK 8

  3. Кодек Apache Commons 1.11

1. Создать проект из шаблона Maven

В терминале (* uix или Mac) или в командной строке (Windows) перейдите в папку, в которой вы хотите создать проект Java. Введите эту команду:

mvn archetype:generate
    -DgroupId={project-packaging}
    -DartifactId={project-name}
    -DarchetypeArtifactId={maven-template}
    -DinteractiveMode=false

Это указывает Maven сгенерировать проект Java из шаблона Maven. Например,

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] ------------------------------------------------------------------------

Вышеупомянутая команда сгенерирует проект Java из шаблонаmaven-archetype-quickstart.

2. Макет каталога Maven

Будет создана следующая структура каталогов проекта. Короче говоря, исходный код помещается в папку/src/main/java/, код модульного теста помещается в/src/test/java/.

image

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

Note
Прочтите этоMaven standard directory layout.

3. POM файл

Просмотрите сгенерированныеpom.xml. Он довольно пустой, всего лишь одна зависимость 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
        
    

Этот файл POM похож на файл Antbuild.xml, он описывает всю информацию о проекте, все: от структуры каталогов, плагинов проекта, зависимостей проекта, того, как собрать этот проект и т.д., прочтите этотofficial POM guide.

4. Обновить 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. Написать код

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

}

Готово.

6. Сборка 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] ------------------------------------------------------------------------

Он компилирует, запускает модульный тест, упаковывает проект в файлjar и помещает его в папкуproject/target.

7. Бег №1

7.1 Run it. Упс… По умолчанию Maven не добавлял зависимости проектаcommons-codec в файл 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
...

Будут сгенерированы две банки, проверьте размер файла:

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. Запуск # 2

8.1 Run it again. Хорошо, результат ожидаемый.

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? Нет, основного класса нет.

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. Запуск # 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

Готово.

10. POM

Окончательный файл POM.

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
                                
                            
                        
                    
                
            

        
    

Скачать исходный код

$ git clone https://github.com/example/maven-examples.git
$ cd java-project
$ mvn package
$ java -jar target/java-project-1.0-SNAPSHOT.jar 123456