Maven2で作ったjarプロジェクトを簡単に実行する
Maven2は依存関係を自動解決してくれたりと便利そうなんだけど、jarで作ったプロジェクトの実行方法がよく分からなかったので調べた。mvn packageは依存ライブラリを含まないしマニフェストの自動生成もしてくれないのでした。
あとjavaコマンドの-classpath指定は-jarと併用できないんだってね。というわけで解決策は以下の2つ。assembly-pluginでもできるらしいけど未確認。
mvn exec:javaコマンドで直接実行
単に開発環境で実行するだけならこれが一番簡単。pom.xmlに以下を追記する。
<plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <configuration> <mainClass>メインクラスをフルネームで(jp.example.App)</mainClass> </configuration> </plugin> </plugins>
次のように実行できる
$ mvn exec:java
引数も渡せる
$ mvn exec:java -Dexec.args="arg1 arg2 arg3"
マニフェストを定義してmvn packageでjarを作る
配布時とかmvn環境外から実行したいときはこっち。pom.xmlに以下を追記。
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>メインクラスをフルネームで(jp.example.App)</mainClass> <packageName>パッケージ名(jp.example)</packageName> <addClasspath>true</addClasspath> <addExtensions>true</addExtensions> <classpathPrefix>dependency(jarファイルからライブラリへのパス)</classpathPrefix> </manifest> </archive> </configuration> </plugin> </plugins>
パッケージを作成
$ mvn package
次に依存ライブラリを全て書き出す。デフォルトでtarget/dependencyに出力される。
$ mvn dependency:copy-dependencies
libに書き出すなら次のようにする。この場合はpom.xmlのclasspathPrefixを適宜書き換える。
$ mvn dependency:copy-dependencies -DoutputDirectory=lib
次のように実行できる
$ java -jar target/projectname-version-SNAPSHOT.jar
もちろん引数も渡せる
$ java -jar target/projectname-version-SNAPSHOT.jar arg1 arg2 arg3
なんというか、Maven2はコマンドが複雑怪奇で覚えるのが大変。Eclipse使わずにJavaをやろうとするのが間違ってるのか…