Maven Jar マニフェスト設定

Maven 3.0の参考サイトがないので書いてゆきます。
まぁ基本的には同じなんだけど。

まずはjar:jarのリファレンスから
http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


  
    
      org.apache.maven.plugins
      maven-jar-plugin
      2.4
      
        
          
            ココにいろいろ設定を書いていきます。
          
        
      
    
  

manifestタグには以下のページで詳細に記載されてます。
http://maven.apache.org/shared/maven-archiver/index.html

よく使う manifest 設定エレメント

  1. addClasspath
  2. classpathLayoutType
  3. classpathPrefix
  4. customClasspathLayout
  5. mainClass


ひとつずつ説明していきます。
addClasspath
■説明
デフォルトfalseで、trueにすると依存関係のあるライブラリをマニフェストのClass-Pathに追加します。
■やってみた
依存関係が必要なのでテキトウにcommonsのライブラリをdependencyした。

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
  </dependency>
  <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.3</version>
  </dependency>
</dependencies>

そんで、manifestタグはこう書く。

<archive>
  <manifest>
    <addClasspath>true</addClasspath>
  </manifest>
</archive>

実行してマニフェストファイルを確認してみる。

$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Built-By: clash_m45
Build-Jdk: 1.6.0_26
Class-Path: commons-lang-2.6.jar commons-io-2.3.jar
Created-By: Apache Maven 3.0.4
Archiver-Version: Plexus Archiver


classpathLayoutType
■説明
Class-Pathの記載フォーマットを設定できる。デフォルトは"simple"。他には"repository"と"custom"が設定できる。
"repository"を設定するとMavenリポジトリ構成になる。
"custom"を設定した場合は必ず"customClasspathLayout"エレメントを設定しないとダメ。
■やってみる
simpleはaddClasspathでやったのと同じ。
repositoryは、こんな感じになった。

<archive>
  <manifest>
    <addClasspath>true</addClasspath>
    <classpathLayoutType>repository</classpathLayoutType>
  </manifest>
</archive>
Class-Path: commons-lang/commons-lang/2.6/commons-lang-2.6.jar commons-io/commons-io/2.3/commons-io-2.3.jar

ふぅん・・・。
customはのちほど。customClasspathLayoutと一緒に。


classpathPrefix
■説明
Class-Pathに入れる依存関係にプリフィックスを入れられます。デフォルトは""(空文字)。
■やってみる

<archive>
  <manifest>
    <addClasspath>true</addClasspath>
    <classpathPrefix>lib</classpathPrefix>
  </manifest>
</archive>

こんな感じになった。

Class-Path: lib/commons-lang-2.6.jar lib/commons-io-2.3.jar

こうすると依存ライブラリをまとめてlib以下においたりすることができます。
ライブラリ別に変更したりはできなそうだからそんなちょっと複雑なことがしたければcustomになるんだろうな。


customClasspathLayout
■説明
Class-Pathをカスタムできます。classpathLayoutTypeを"custom"にする必要あり。
■やってみる
プロパティとか使えるみたい。普通に文字列で直接指定とかでもOKです。

<archive>
  <manifest>
    <addClasspath>true</addClasspath>
    <classpathLayoutType>custom</classpathLayoutType>
    <customClasspathLayout>ext/${artifact.artifactId}.${artifact.extension}</customClasspathLayout>
  </manifest>
</archive>

こんな感じになった。

Class-Path: Class-Path: ext/commons-lang.jar ext/commons-io.jar

artifactはdependencyの内容を扱えるみたい。
レイアウトを指定するものみたいだから、直接指定だと2回でちゃうみたい、まぁ問題ないからスルーしてもよし。


mainClass
■説明
Main-Classを設定します。
■やってみる

<archive>
  <manifest>
    <addClasspath>true</addClasspath>
    <mainClass>com.hello.App</mainClass>
  </manifest>
</archive>

こんな感じになった。

Class-Path: commons-lang-2.6.jar commons-io-2.3.jar
Main-Class: com.hello.App

そんで、実行できるか。

$ java -jar hello-1.0-SNAPSHOT.jar
Hello World!

はいおっけー!