magのOSS備忘録

使ったOSSソフトウェアについて書いていきます。

Mavenで実行可能なjarファイルを作成する(CLIアプリケーションを作成する)

概要

JavaCLIアプリケーションを作りたい。
実行時にclasspathやエントリポイントを指定せずに実行できるようにしたい。
Mavenを使って、ライブラリなどのパッケージ取得し、ビルドを行い、実行可能なjarファイルを作るまでの手順を記載する。

目次

実行環境・前提条件

OpenJDKのインストール

OpenJDKとして、Eclipse Temurinを使用した。
以下のサイトからLTSのTemurin 17を選択してダウンロードし、インストールを行った。

Adoptium - Open source, prebuilt OpenJDK binaries

取得したインストーラを使って、Eclipse Temurinをインストールする。インストールはインストーラに従って操作すれば簡単にインストールできる。インストーラに従い、Windows環境変数に以下を設定する。

Mavenのインストール

以下のサイトからMavenの実行バイナリを取得する。
ダウンロードしたファイルを任意のフォルダに展開する。展開したフォルダの中にあるbinフォルダを、Windows環境変数のPATHに登録する。これでコマンドプロンプトからMavenが実行可能になる。

Maven – Download Apache Maven

Mavenプロジェクトの作成

Mavenの以下のドキュメントに従って、プロジェクトを作成する。

Maven – Maven in 5 Minutes

以下はドキュメントに記載されているコマンドで、これを実行するとプロジェクトのひな形が作成できる。 以後は生成されたpom.xmlを使い、プロジェクトのビルドを設定する。

>mvn archetype:generate \
    -DgroupId=test \
    -DartifactId=cli-app \
    -DarchetypeArtifactId=maven-archetype-quickstart
    -DarchetypeVersion=1.4 \
    -DinteractiveMode=false
     

groupIdやartifactIdの意味は以下のページに記載されているが、それぞれ任意に決める。

Maven – Guide to Naming Conventions

プロジェクトの生成が成功すれば、以下のコマンドでひな形のアプリケーションが起動する。

>cd cli-app
>mvn package
>java -cp target\cli-app-1.0-SNAPSHOT.jar test.App
Hello World!

pom.xmlの編集

ただ、このままではjarファイル内のMANIFEST.MFにメインクラスが記載されないため、上記のようにメインクラスを指定しなければ実行ができない。それは手間なので、jarファイルを作成するためのMavenプラグイン(maven-jar-plugin)に追加の設定を行う。

pom.xmlを編集し、以下のように<mainClass>でmainメソッドを持つクラスを指定する。

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
          <finalName>cli-app-${project.version}</finalName>
          <archive>
            <manifest>
              <mainClass>test.App</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>

再度、コマンドプロンプトで以下のように実行すれば、メインクラスの指定なしに実行が可能になる。

>mvn clean
>mvn package
>java -jar target\cli-app-1.0-SNAPSHOT.jar
Hello World!

maven-assembly-pluginについて

Mavenには類似のjarファイルを操作するプラグインとしてmaven-assembly-pluginがある。これはメインのビルドターゲットとは別に、jarファイル(またはzipやtarなどのファイル)を生成するために使用する。

参考:テストをスキップする

ビルド時に以下のようにオプションを付与することで、テスト用のコードのコンパイルと実行をスキップすることができる。

>mvn package -Dmaven.test.skip