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