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をやろうとするのが間違ってるのか…