Mavenで実行可能なJARファイルを作成

Mavenで実行可能なJARファイルを作成

概要

本記事では、Mavenで実行可能なJARファイルを簡単にビルドして作成する方法を記載します。ローカルで実行するようなツール等をJavaで作成する際には、JARファイルをコマンドもしくはダブルクリックで実行可能になるので参考にしていただければと思います。

プロジェクトの作成

mvnコマンドでJavaプロジェクトのスケルトンを作成します。

mvn archetype:generate
[...]
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1388: 
Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
7: 1.3
8: 1.4
Choose a number: 8: 
Define value for property 'groupId': com.yhayashi30.sample
Define value for property 'artifactId': maven-jar-sample
Define value for property 'version' 1.0-SNAPSHOT: : 
Define value for property 'package' com.yhayashi30.sample: : 
Confirm properties configuration:
groupId: com.yhayashi30.sample
artifactId: maven-jar-sample
version: 1.0-SNAPSHOT
package: com.yhayashi30.sample
 Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-quickstart:1.4
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.yhayashi30.sample
[INFO] Parameter: artifactId, Value: maven-jar-sample
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: com.yhayashi30.sample
[INFO] Parameter: packageInPathFormat, Value: com/yhayashi30/sample
[INFO] Parameter: package, Value: com.yhayashi30.sample
[INFO] Parameter: groupId, Value: com.yhayashi30.sample
[INFO] Parameter: artifactId, Value: maven-jar-sample
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Project created from Archetype in dir: /Users/yoshiyuki.hayashi/sf-workspace/maven-jar-sample
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  03:06 min
[INFO] Finished at: 2019-07-27T12:36:29+09:00
[INFO] ------------------------------------------------------------------------

maven-assembly-plugin

maven-assembly-pluginは、プロジェクトの出力をその依存関係、モジュール、ドキュメント、およびその他のファイルと共に単一の配布可能なアーカイブにまとめることを可能にします。
今回は、JARファイルの形式でアーカイブしたいので、jar-with-dependenciesを指定します。
また、<archive>の<manifest>で実行クラスのパスを指定します。
追加で<appendAssemblyId>をfalseに設定しています。そうしないと、作成されるjarファイルに-jar-with-dependenciesが最終的な名前に追加されてしまいます。
下記をpom.xmlファイルに記載します。

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.1.1</version>
        <configuration>
          <appendAssemblyId>false</appendAssemblyId>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>com.yhayashi30.sample.App</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id> 
            <phase>package</phase> 
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      [...]
</project>

maven-dependency-plugin

maven-dependency-pluginのcopy-dependenciesを使用することで、プロジェクトの直接の依存関係とオプションで推移的な依存関係のリストを取得し、それらを指定された場所にコピーします。
下記をpom.xmlファイルに記載します。

<project>
  [...]
  <build>
    [...]
    <plugins>
      [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.1.1</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <!-- configure the plugin here -->
            </configuration>
          </execution>
        </executions>
      </plugin>
</project>

サンプル

Githubに本記事のサンプルを格納しています。cloneして、mvn packageすることでJARファイルを作成できます。
https://github.com/yhayashi30/maven-jar-sample

git clone git@github.com:yhayashi30/maven-jar-sample.git

cd maven-jar-sample

mvn package

java -jar ./target/maven-jar-sample-1.0-SNAPSHOT.jar

参考

Apache Maven Assembly Plugin
http://maven.apache.org/plugins/maven-assembly-plugin/
Apache Maven Assembly Plugin Usage
http://maven.apache.org/plugins/maven-assembly-plugin/usage.html
Apache Maven Dependency Plugin
https://maven.apache.org/plugins/maven-dependency-plugin/
Apache Maven Dependency Plugin Usage
https://maven.apache.org/plugins/maven-dependency-plugin/usage.html