Maven – 太いJarファイルを作成する – 1つのJARの例

このチュートリアルでは、Mavenビルドツール、One-JARプラグインを使用して、単一のJarファイルとその依存関係Jarを1つの実行可能なJarファイル(いわゆるfat Jar)に作成する方法を説明します。
使用されるツール:
-
Maven 3.1.1
-
JDK 1.7
-
Joda-time 2.5
1.単純なJavaプロジェクトを作成する
MavenクイックスタートテンプレートからJavaプロジェクトを作成します。
$ mvn archetype:generate -DgroupId=com.mkyong.core.utils -DartifactId=dateUtils -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
以下のファイルとフォルダ構造が作成されます。
. |________dateUtils | |________pom.xml | |________src | | |________main | | | |________java | | | | |________com | | | | | |________mkyong | | | | | | |________core | | | | | | | |________utils | | | | | | | | |________App.java | | |________test | | | |________java | | | | |________com | | | | | |________mkyong | | | | | | |________core | | | | | | | |________utils | | | | | | | | |________AppTest.java
Eclipseに対応してください。
$ mvn eclipse:eclipse
Eclipse IDEにプロジェクトをインポートします。

2. Pom.xmlを更新する
jodatime依存関係を宣言するために `pom.xml`を更新してください。 `Jar`形式に出力するには、パッケージタグが ‘jar’に設定されていることを確認してください。コメントを読み、自明です。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4__0__0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mkyong.core.utils</groupId>
<artifactId>dateUtils</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>dateUtils</name>
<url>http://maven.apache.org</url>
<properties>
<jdk.version>1.7</jdk.version>
<jodatime.version>2.5</jodatime.version>
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${jodatime.version}</version>
</dependency>
</dependencies>
<build>
<finalName>dateutils</finalName>
<plugins>
<!-- download source code in Eclipse, best practice -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>false</downloadJavadocs>
</configuration>
</plugin>
<!-- Set a compiler level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
<!-- Make this jar executable -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.mkyong.core.utils.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
3. JodaTimeでCurrentDateを取得する
生成された `App.java`を以下の内容で更新してください:
App.java
package com.mkyong.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. Jarファイル
Mavenはプロジェクトをパッケージ化して最終的なJarファイルを生成します。新しい
dateutils.jar`が
$ project/target`フォルダに作成されます。
$ mvn package
jarの内容をリストします。
$ jar tf target/dateutils.jar META-INF/META-INF/MANIFEST.MF com/com/mkyong/com/mkyong/core/com/mkyong/core/utils/com/mkyong/core/utils/App.class META-INF/maven/META-INF/maven/com.mkyong.core.utils/META-INF/maven/com.mkyong.core.utils/dateUtils/META-INF/maven/com.mkyong.core.utils/dateUtils/pom.xml META-INF/maven/com.mkyong.core.utils/dateUtils/pom.properties
このJarファイルを実行してみてください。
$ java -jar dateutils.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/joda/time/LocalDate
at com.mkyong.core.utils.App.getLocalCurrentDate(App.java:14)
at com.mkyong.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つのJarの例
`pom.xml`を更新してOne-Jarプラグインを使用すると、その依存関係Jarと共に単一のJarが作成されます。
pom.xml
<project>
<build>
<plugins>
<!-- Includes the runtime dependencies -->
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- One-Jar is in the googlecode repository -->
<pluginRepositories>
<pluginRepository>
<id>onejar-maven-plugin.googlecode.com</id>
<url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
</pluginRepository>
</pluginRepositories>
</project>
もう一度パッケージ化すると、
dateUtils.jar`と
dateUtils-one-jar.jar`という2つのjarファイルが “target”フォルダに作成されます。
$ mvn package
`dateUtils-one-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/joda-time-2.5.jar`のような
lib`フォルダにランタイムの依存関係を置き、
main/dateutils.jar 'のように
main`フォルダのメインjarを入れます。さらに、インクルードされたJarsを正しく読み込むのに役立つたくさんのsimontuffsクラスも作成します。
最後のファットジャーを実行してみてください。
$ java -jar dateutils.one-jar.jar 2014-10-18
完了しました。
ソースコードをダウンロードする
ダウンロード:
maven -one-jar-example.zip
(6 KB)
参考文献
-
https://code.google.com/p/onejar-maven-plugin/
[onejar-maven-plugin
公式ページ]。
Joda Time
-
link://maven/how-to-create-a-jar-file-with-maven/[jarを作成する方法
Mavenのファイル]