Mavenで管理しているSpringのプロジェクトで実行可能jarファイルを作成する
特に何も設定しないままmvn clean packageとすると、ただのjarファイルが作成されます。
色々と調べてみたところ、きちんと動作しそうな実行可能jarファイルを作成する方法は概ね以下の通りの様です。(Antについては調べていません)
- eclipseでエクスポート⇒実行可能JARファイルを選択
- maven-jar-pluginとmaven-dependency-pluginを使う
- maven-shade-pluginを使う
eclipseでエクスポート⇒実行可能JARファイルを選択
eclipseでエクスポートする場合、ライブラリの処理方法の違いにより3つの選択肢があります。
ブログを書く前に再度動作を確認したところ、突発的にエラーが出たりと課題が残ってしまいました。
maven-jar-pluginとmaven-dependency-pluginを使う
プロジェクトのPOMに以下の様な設定を追加します。libフォルダを作成し、そこに依存jarファイルをコピーする方法です。特に問題なく動作しました。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.4</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <mainClass>com.imarket.tdnet.spider.DurationStarter</mainClass> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> </configuration> </plugin>
参考にしたサイト
JavaとXMLのマニアな開発:Maven2実践 pom.xml : buildのtarget\lib作成
maven-shade-pluginを使う
プロジェクトのPOMに以下の様な設定を追加します。1つのjarファイルにまとめてしまう方法。Fat Jarと言うらしいですね。
eclipseで生成されるJARに必須ライブラリーを抽出する方法では「Unable to locate Spring NamespaceHandler for 〜」というエラーが出ていましたが、こちらは上手く解決できるようです。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <finalName>myapp</finalName> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.imarket.tdnet.spider.DurationStarter</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
ただ、何故かこの方法でも@Configurableアノテーションを付けたクラスで@Autowiredを付けた変数がDIされませんでした。。
参考にしたサイト
ellerの日記 Mavenプラグインで外部ライブラリをrepackageする方法
最後に
このブログを書いた時点では解決出来ていない問題がありますが、きちんと詳細を追っていけば解決出来るような気もします。適宜アップデート出来ればと思います。