Maven –太いJarファイルの作成– One-JARの例
このチュートリアルでは、MavenビルドツールであるOne-JARプラグインを使用して、単一のJarとその依存関係のJARを単一の実行可能Jarファイル(ファットJar)に作成する方法を示します。
使用ツール:
-
Maven 3.1.1
-
JDK 1.7
-
ジョーダタイム2.5
1. 簡単なJavaプロジェクトを作成する
MavenクイックスタートテンプレートからJavaプロジェクトを作成します。
$ mvn archetype:generate -DgroupId=com.example.core.utils -DartifactId=dateUtils -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
次のファイルとフォルダー構造が作成されます。
. |____dateUtils | |____pom.xml | |____src | | |____main | | | |____java | | | | |____com | | | | | |____example | | | | | | |____core | | | | | | | |____utils | | | | | | | | |____App.java | | |____test | | | |____java | | | | |____com | | | | | |____example | | | | | | |____core | | | | | | | |____utils | | | | | | | | |____AppTest.java
Eclipseをサポートするようにします。
$ mvn eclipse:eclipse
プロジェクトをEclipse IDEにインポートします。
2. Pom.xmlを更新する
pom.xml
を更新して、jodatimeの依存関係を宣言します。 Jar
形式に出力するには、パッケージタグが「jar」に設定されていることを確認してください。 自明のコメントを読んでください。
pom.xml
4.0.0 com.example.core.utils dateUtils jar 1.0-SNAPSHOT dateUtils http://maven.apache.org 1.7 2.5 4.11 junit junit ${junit.version} test joda-time joda-time ${jodatime.version} dateutils org.apache.maven.plugins maven-eclipse-plugin 2.9 true false org.apache.maven.plugins maven-compiler-plugin 2.3.2 ${jdk.version} ${jdk.version} org.apache.maven.plugins maven-jar-plugin com.example.core.utils.App
3. JodaTimeで現在の日付を取得する
生成されたApp.java
を次の内容で更新します。
App.java
package com.example.core.utils; import org.joda.time.LocalDate; public class App { public static void main(String[] args) { System.out.println(getLocalCurrentDate()); } //Print current date with JodaTime private static String getLocalCurrentDate() { LocalDate date = new LocalDate(); return date.toString(); } }
4. ジャーファイル
Mavenはプロジェクトをパッケージ化して、最終的なJarファイルを生成します。 新しいdateutils.jar
が$project/target
フォルダーに作成されます。
$ mvn package
jarコンテンツをリストします。
$ jar tf target/dateutils.jar META-INF/ META-INF/MANIFEST.MF com/ com/example/ com/example/core/ com/example/core/utils/ com/example/core/utils/App.class META-INF/maven/ META-INF/maven/com.example.core.utils/ META-INF/maven/com.example.core.utils/dateUtils/ META-INF/maven/com.example.core.utils/dateUtils/pom.xml META-INF/maven/com.example.core.utils/dateUtils/pom.properties
このJarファイルを実行してみてください。
$ java -jar dateutils.jar Exception in thread "main" java.lang.NoClassDefFoundError: org/joda/time/LocalDate at com.example.core.utils.App.getLocalCurrentDate(App.java:14) at com.example.core.utils.App.main(App.java:9) Caused by: java.lang.ClassNotFoundException: org.joda.time.LocalDate at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) ... 2 more
joda-time.jar
が欠落しているため、上記は予想されるエラーメッセージです。
5. 1瓶の例
One-Jarプラグインを使用するようにpom.xml
を更新すると、依存関係のJarとともに単一のJarが作成されます。
pom.xml
org.dstovall onejar-maven-plugin 1.4.4 one-jar onejar-maven-plugin.googlecode.com http://onejar-maven-plugin.googlecode.com/svn/mavenrepo
再度パッケージ化すると、「ターゲット」フォルダーにdateUtils.jar
とdateUtils-one-jar.jar
の2つのjarが作成されます。
$ mvn package
dateUtils-one-jar.jar
は、必要な最後のfat-jarです。jarの内容をリストしてください:
$ jar tf target/dateutils.one-jar.jar META-INF/MANIFEST.MF main/dateutils.jar lib/joda-time-2.5.jar com/ com/simontuffs/ com/simontuffs/onejar/ .version OneJar.class com/simontuffs/onejar/Boot$1.class com/simontuffs/onejar/Boot$2.class com/simontuffs/onejar/Boot$3.class com/simontuffs/onejar/Boot.class com/simontuffs/onejar/Handler$1.class com/simontuffs/onejar/Handler.class com/simontuffs/onejar/IProperties.class com/simontuffs/onejar/JarClassLoader$1.class com/simontuffs/onejar/JarClassLoader$2.class com/simontuffs/onejar/JarClassLoader$ByteCode.class com/simontuffs/onejar/JarClassLoader$FileURLFactory$1.class com/simontuffs/onejar/JarClassLoader$FileURLFactory.class com/simontuffs/onejar/JarClassLoader$IURLFactory.class com/simontuffs/onejar/JarClassLoader$OneJarURLFactory.class com/simontuffs/onejar/JarClassLoader.class com/simontuffs/onejar/OneJarFile$1.class com/simontuffs/onejar/OneJarFile$2.class com/simontuffs/onejar/OneJarFile.class com/simontuffs/onejar/OneJarURLConnection.class src/ src/com/ src/com/simontuffs/ src/com/simontuffs/onejar/ src/OneJar.java src/com/simontuffs/onejar/Boot.java src/com/simontuffs/onejar/Handler.java src/com/simontuffs/onejar/IProperties.java src/com/simontuffs/onejar/JarClassLoader.java src/com/simontuffs/onejar/OneJarFile.java src/com/simontuffs/onejar/OneJarURLConnection.java doc/ doc/one-jar-license.txt
One-Jarプラグインは、実行時の依存関係をlib
フォルダー(lib/joda-time-2.5.jar
など)に配置し、メインjarをmain
フォルダー(main/dateutils.jar
など)に配置します。 さらに、多くのsimontuffsクラスを作成して、含まれているJarsを正しくロードできるようにします。
最終的なfat-jarを実行してみてください。
$ java -jar dateutils.one-jar.jar 2014-10-18
完了しました。
ソースコードをダウンロード
ダウンロード–maven-one-jar-example.zip(6 KB)