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

Maven –太いJarファイルの作成– One-JARの例

java jar with maven

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

使用ツール:

  1. Maven 3.1.1

  2. JDK 1.7

  3. ジョーダタイム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にインポートします。

one-jar-folder-structure

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.jardateUtils-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)