Maven - Javaプロジェクトを作成する方法

Maven – Javaプロジェクトの作成方法

このチュートリアルでは、Mavenを使用してJavaプロジェクトを管理する方法を示します。Javaプロジェクトを作成、依存関係を追加し、実行可能なjarファイルにパッケージ化します。 最後に、実行可能なjarファイルを作成して、指定された文字列をSHA-256アルゴリズムでハッシュします。

使用される技術:

  1. Maven 3.5.3

  2. JDK 8

  3. Apache Commons Codec 1.11

1. Mavenテンプレートからプロジェクトを作成する

ターミナル(* uixまたはMac)またはコマンドプロンプト(Windows)で、Javaプロジェクトを作成するフォルダーに移動します。 次のコマンドを入力します。

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

これにより、MavenはMavenテンプレートからJavaプロジェクトを生成します。 例えば、

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

上記のコマンドは、maven-archetype-quickstartテンプレートからJavaプロジェクトを生成します。

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を確認します。 まったく空で、1つの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
...

2つの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