[Java] 60 Maven関連コマンド

[Java SE 13、maven.compiler : 1.7]

Maven関連コマンドをまとめました。

EclipseやVScode拡張機能で行き詰まったら、コマンドでのMavenプロジェクト作成をお勧めします。

1. 空のMavenプロジェクトを作成する。

# Mavenプロジェクトを作成するディレクトリに移る
cd /projects

# 空のMavenプロジェクトを作成する(対話モードではなく一括モード(BatchMode))
mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DgroupId=[グループID(例 com.example)] -DartifactId=[プロジェクト名(例 test)]

2. プロジェクト完成後、依存関係にあるライブラリを含むjar実行ファイルを作成する。

# Mavenプロジェクトのディレクトリに移る
cd /projects/test

# jar実行ファイルを作成する
mvn assembly:assembly -DdescriptorId=jar-with-dependencies

3. Mainクラスとクラスパスの情報をjarのMANIFEST.MFに追加する。

# ターゲットディレクトリに移る
cd /projects/test/target

# Mainクラスとクラスパスの情報をjarのMANIFEST.MFに追加する
jar uvfm test-1.0-SNAPSHOT-jar-with-dependencies.jar manifest.txt

# オプションuvfmの意味
u:アップデート,v:詳細な標準出力生成,f:jarファイル名指定,m:manifestファイル名指定

# manifest.txtの内容
Main-Class: com.example.Main
Class-Path: com.example

4. 完成したjar実行ファイルをダブルクリックして起動し、動作確認します

ダブルクリックと同義のコマンドは以下の通りです(今回のプロジェクトの場合)。

javaの後にVScodeのlaunch.jsonで設定した引数、-cpオプション、そしてMainクラスを含むjarファイル名とMainクラスを入力します。

java --module-path /javafx-sdk-11.0.2/lib --add-modules javafx.controls,javafx.fxml -verbose:class -Dfile.encoding=UTF-8 -cp test-1.0-SNAPSHOT-jar-with-dependencies.jar com.example.Main

ネット情報等では”java -jar jar実行ファイル名”で起動できるとありますが、あくまでHello worldのような単純なプロジェクトの場合であって、それなりに手を入れたプロジェクトでは上のような長いコマンドになります。

[Java] 59 Mavenプロジェクトのjar実行ファイル作成

[Java SE 13、maven.compiler : 1.7]

EclipseやVScode拡張機能はターミナルのコマンド操作を代行してくれているブラックボックスであり、そこにバグが含まれていると真因が自分の操作なのかそれ以外なのか切り分けが難しくなります。またMavenが完璧だとも限りません。

そこでこれらのツールを使わずにコマンド操作だけでMavenプロジェクトを作成し、jar実行ファイルを作ってみました。

その結果、これまで上手くいかなかった原因が判明しました。POMにmaven-assembly-pluginについて記述しているにも関わらず、依存関係にあるライブラリを含んだjar実行ファイルを作成できていませんでした。

POMの該当箇所を削除し、以下コマンドでjar実行ファイルを作成しました。これで長いトンネルを抜けることができました。

mvn assembly:assembly -DdescriptorId=jar-with-dependencies

Eclipseについては自分の知識が足りないとしても、”mvn package”コマンドが正常に機能しないというのは想定外でした。まさかPOMに記述したことをそのまま実行してくれないとは。

まあターミナルへの出力をよく読めば分かることですし、そもそもファイル名にjar-with-dependenciesを含むjarファイルが作成されない時点で気付けよ、といった感じです。

やはりツールに頼らず、ログを丹念にチェックしながら自分でコマンドを打っていくのが王道ですね。