Maven 入門 | Java アプリケーション開発 | maven-jar-plugin で実行可能 Jar を作成

前章でプログラムの実行は簡単になったが、まだ完全ではない。

target フォルダにパッケージ化された Jar ファイルが生成されたが、これをそのまま実行しようとしても動作しない。たとえば、次のようにコマンドを実行してみる。

java -jar target/SampleMavenApp-1.0-SNAPSHOT.jar

すると、次のようなエラーメッセージが出力される。

target/SampleMavenApp-1.0-SNAPSHOT.jar にメイン Manifest 属性がありません。

mvn package で生成された Jar ファイルは、実行可能 Jar ではない。マニフェストファイルが正しく生成されていないため、そのままでは使用できない。

maven-jar-plugin の設定について

Jar ファイルの生成は maven-jar-plugin というプラグインによって行われる。このプラグインに、マニフェストファイル作成のための設定情報を追加すると、次のような形になる。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>メインクラスを指定</mainClass>
                <addClasspath>true</addClasspath>
                <addExtensions>true</addExtensions>
                <packageName>パッケージ</packageName>
            </manifest>
        </archive>
    </configuration>
</plugin>

設定情報を記述する <configuration> の中に、アーカイブに関する設定である <archive> タグがある。その中にマニフェストファイルに関する <manifest> タグがあり、ここにマニフェストの情報を記述する。記述する内容は次のとおりである。

タグ 説明
<mainClass> メインクラスを指定する。
<addClasspath> クラスパス(Class-Path 値)を追加するかどうかを指定する。これは true にすればよい。
<addExtensions> 拡張情報を含める。これは <dependencies> に記述されたライブラリ情報を出力するためのものである。これも true にすればよい。
<packageName> Jar パッケージを出力する。

特にライブラリを使用せず、SampleMavenApp のような簡単なプログラムであれば、<mainClass> だけ指定すればよい。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.devkuma.App</mainClass>
                <addClasspath>true</addClasspath>
                <addExtensions>true</addExtensions>
                <packageName>com.devkuma</packageName>
            </manifest>
        </archive>
    </configuration>
</plugin>

このように pom.xml に記述し、mvn package で Jar ファイルを生成して、java -jar で SampleMavenApp-1.0-SNAPSHOT.jar を実行してみる。今回は問題なく実行できるはずである。

$ java -jar target/SampleMavenApp-1.0-SNAPSHOT.jar 
Hello World!

pom.xml の完成版

ここまで説明したプラグイン情報を追加した pom.xml の完成版は次のとおりである。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.devkuma</groupId>
  <artifactId>SampleMavenApp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>SampleMavenApp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.6.0</version>
        <configuration>
          <mainClass>com.devkuma.App</mainClass>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
          <archive>
            <manifest>
                <mainClass>com.devkuma.App</mainClass>
                <addClasspath>true</addClasspath>
                <addExtensions>true</addExtensions>
                <packageName>com.devkuma</packageName>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

これは Java アプリケーションを作成してすぐに実行したり、実行可能 Jar ファイルを作成したりする場合の基本的なコードである。

プラグインが不要になったら削除してもかまわない。たとえば、実行可能 Jar を作る場合に exec:java で実行できなくてもよいなら、exec-maven-plugin の <plugin> 部分は削除してもよい。必要に応じて修正しながら利用する。