Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

MavenでFat JARを作成する方法(Assembly Pluginの使用方法)

Maven の Assembly Plugin を使って、fat jar(依存するライブラリも含む jar)を作成する方法を書いていきます。

※ fat jar は uber-jar と呼ばれることもあります。

1. 作成方法

pom.xml に、アセンブリプラグインの定義を追加します。

<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.4.2</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>[Main-ClassのFQCN]</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
    ...
  </build>
  ...
</project>

<execution> の定義によって、コマンド mvn package を実行したときに、ゴール assembly:single が実行されるようになります。

2. Fat Jar の作成例

サンプルプロジェクト sample-fatjar で、fat jar を作成して実行する方法を記載します。

2.1. pom.xml の作成

以下の pom.xml を作成します。

sample-fatjar/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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.sample</groupId>
  <artifactId>sample-fatjar</artifactId>
  <version>0.0.1</version>
  <packaging>jar</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.13.4</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.4.2</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>org.sample.fatjar.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

ライブラリ(依存関係)に jackson-databind を追加しています。

2.2. Mainクラスの作成

以下の Mainクラスを作成します。

sample-fatjar/src/main/java/org/sample/fatjar/Main.java

package org.sample.fatjar;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
  static class Dog {
    public String name;
    public int age;
    public Dog(String name, int age) {
      this.name = name;
      this.age = age;
    }
  }
  public static void main(String[] args) throws JsonProcessingException {
    Dog dog = new Dog("むぎ", 2);
    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writeValueAsString(dog));
  }
}

Jackson の ObjectMapper を使用しています。

2.3. ビルドの実行

ディレクトsample-fatjar で、以下のコマンドを実行します。

mvn package

実行すると、target ディレクトリに以下の jar が作成されます。

  • 通常のjar:sample-fatjar-0.0.1.jar
  • fat jar:sample-fatjar-0.0.1-jar-with-dependencies.jar

jar コマンドを使うと、fat jar にライブラリが含まれていることを確認できます。

jar tvf target/sample-fatjar-0.0.1-jar-with-dependencies.jar

2.4. プログラムの実行

以下のコマンドで、fat jar を実行することができます。

java -jar target/sample-fatjar-0.0.1-jar-with-dependencies.jar

実行すると、Mainクラスの標準出力を確認できます。

{"name":"むぎ","age":2}

3. mainClass について

pom.xml<mainClass> を設定しないと、プログラム実行時に以下のエラーが出力されました。

target/sample-fatjar-0.0.1-jar-with-dependencies.jarにメイン・マニフェスト属性がありません

参考サイト

Apache Maven Assembly Plugin - Usage