mavenで実行可能なjarファイルと依存ライブラリを含めたzipアーカイブを作成する

以下の条件を満たすアーカイブを作成したいなーという状況が発生したときのmaven設定を忘れないように残しておく。

  • コマンドから java -jar で実行可能なエントリーポイントを含むjarを作る
  • 上記jarで必要なライブラリ類を同包したアーカイブを作る

外部に依存することなくエントリーポイントからの処理を実行する事が目的。
使用するプラグインは maven-jar-plugin と maven-assembly-plugin。

maven-jar-plugin

jarファイルのManifestファイルを設定することができる。
Manifestファイルを作成しておくことで、メインクラス(-jarで実行する際のエントリーポイント)を指定することができる。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>sample.hoge.Main</mainClass>
        <addClasspath>true</addClasspath>
        <addExtensions>false</addExtensions>
        <classpathPrefix></classpathPrefix>
      </manifest>
    </archive>
  </configuration>
</plugin>

mainClass: メインクラスをフルパスで
addClasspath: pom.xml の dependenciesをクラスパスとしてマニフェストファイルに出力するか否か
addExtensions: pom.xml の dependenciesの拡張情報もマニフェストファイルに出力するか否か
classpathPrefix: addClasspathがtrueの場合にクラスパスにつける接頭語(lib/とかext/とか)

maven-assembly-plugin

配布用のアーカイブを作成するためのプラグイン。
必要なライブラリのjarも含めたアーカイブを作成するように設定すれば、外部に依存しない完結したアーカイブファイルを作成できる。

<pom.xml>

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <finalName>batchfile/hogetarou</finalName>
  </configuration>
  <executions>
    <execution>
      <id>make-sample-batch-zip</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

finalName: 出力するファイル名 targetディレクトリからの相対パスになる。
executionタブでの設定は packageフェーズに assembly:single の実行を含むための設定です。
こうしておけば、mvn assembly:single を直接実行しなくても、mvn package 実行時にアーカイブができる。

デフォルトのアーカイブ形式は以下。

  • bin: バイナリ配布用のアーカイブ
  • jar-with-dependencies: プロジェクトと依存するライブラリをまとめた 1 つの JAR ファイル
  • src: ソース配布用のアーカイブ

今回実現したい事は、jar-with-dependencies 形式を指定すれば実現できそうなのだけど、親モジュールとの関係で独自形式でアセンブリの設定をすることに。
依存関係の断ち切り方を時間内で発見する事ができなかったのです(assembly-plugin を使う場合、アセンブリファイルの配置が必須になってしまっていた)。※
独自形式でアセンブリの設定をする場合は pom.xml の他にアセンブリ記述子を配置する必要があります。
アセンブリ記述子はデフォルトで src/main/assembly 配下に置くことになっています。

<executable.xml>

<assembly
  xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
  <id>sample</id>
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>false</unpack>
      <scope>runtime</scope>
      <outputDirectory>output/</outputDirectory>
    </dependencySet>
  </dependencySets>
</assembly>

output というディレクトリ内にdependencyとMainのjarを含めたzipファイルを作成しますよ、という設定。

上記を設定で maven package を実行すると

  1. target/batchfile/hogetarou.zip ができている
  2. hogetarou.zipをunzipするとoutputというディレクトリが展開される
  3. outputのなかにはMainのjarと依存ライブラリのjarが同列に格納されている
  4. java -jar [Mainのjar] でプログラムが実行される状態になっている

と、なりました。

この記事がとても良くまとまっていて、自分が作成した方法以外も勉強になりました。
Sacrificed & Exploited – Mavenで配布用zipファイルを作成する
http://d.hatena.ne.jp/cnaos/20100102/1262430319

今後、m※の部分をなんとかできそうだったら、なんとかしてみたいと思います。時間があれば。

その他、四苦八苦している際に参考にさせてもらったサイト
ありがとうございました。
http://www.in-vitro.jp/blog/index.cgi/Maven/20060215_01.htm


3 comments:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です