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

Java Jar with Maven、width = 229、height = 108

このチュートリアルでは、Mavenビルドツール、One-JARプラグインを使用して、単一のJarファイルとその依存関係Jarを1つの実行可能なJarファイル(いわゆるfat Jar)に作成する方法を説明します。

使用されるツール:

  1. Maven 3.1.1

  2. JDK 1.7

  3. 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にプロジェクトをインポートします。

one-jar-folder-structure、幅= 430、高さ= 337

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)

参考文献

公式ページ]。 Joda Time

  1. link://maven/how-to-create-a-jar-file-with-maven/[jarを作成する方法

Mavenのファイル]