実際に作業しているときにちょくちょく役立つ小ネタです。
ビルド時の小ネタ
ビルド時に-DskipTests
でテストの実行をスキップすることは皆さんよくやると思います(?)。
同じように-Dmaven.test.skip
でもテストの実行をスキップできますが、こちらはテストコードのコンパイルもスキップするのでテストコードがコンパイルエラーになっていても大丈夫です(??)。
更にmvn package -Dmaven.test.skip
を実行してもtest
スコープの依存関係が壊れている場合(依存解決できない場合。Mavenセントラル以外のリポジトリを参照しているプロジェクトなんかでまれによくある)はビルドエラーになってしまいます。
そういった場合はmvn package
せず、mvn compile jar:jar
(packaging
がwar
の場合はjar:jar
ではなくwar:war
)するとtest
スコープの依存関係を解決せずにビルドを行うので大丈夫です(???)。
ビルド失敗時の調査まわりの小ネタ
-e
オプションを付けるとビルド失敗時にスタックトレースが出力されます。
経験的にMavenはスタックトレースを見てもすぐには原因特定できないこともしばしばですが、無いより全然良いので基本的には-e
オプションを付けておくとよいでしょう。
それから-X
オプションを付けるとデバッグログが出力されます。
大量のログが出力されてコンソールを遡るのが大変なので、-l
オプションを併用してログファイルへ書き出すのがオススメです。
こんな感じです。
mvn -X -l maven.log test
調査の過程でMavenのコードを読みたくなった場合はhttps://github.com/apache/mavenから取得すると良いでしょう。
デプロイ時の認証まわりの小ネタ
JARやWARをNexusのようなMavenリポジトリへデプロイする際、Mavenはsettings.xml
からデプロイ先となるサーバーの認証情報を読み取ります。
CI/CDツールでデプロイする場合、次のようなsettings.xml
をソースコードと同じ場所に置き、-s
オプションで指定する(コマンド例 mvn -s settings.xml deploy
)方法があります。
<settings>
<servers>
<server>
<id>nexus</id>
<username>deployuser</username>
<password>deploypassword</password>
</server>
</profiles>
</settings>
なお、パスワードをハードコーディングしたくない場合はpassword
要素を次のようにすることで環境変数から読み取ることも可能です。
<password>${env.DEPLOY_PASSWORD}</password>
この場合、環境変数DEPLOY_PASSWORD
からパスワードを読み取ります。
CI/CDツールはビルド時に環境変数へ秘密情報を設定するものがありますが、そのような環境で使える方法です。
また、ローカルのsettings.xml
でもパスワードをハードコーディングしたくない場合、暗号化することが可能です。
詳しくはMaven公式ドキュメントのPassword Encryptionのセクションを参照してください。
ヘルプまわりの小ネタ
mvn --help
でmvn
コマンドのヘルプが見られますが、mvn <プラグイン>:help
とすることでプラグインのゴールを一覧できます。
例えばmvn compiler:help
を実行すると次のような出力を得られます。
[INFO] Apache Maven Compiler Plugin 3.8.0
The Compiler Plugin is used to compile the sources of your project.
This plugin has 3 goals:
compiler:compile
Compiles application sources
compiler:help
Display help information on maven-compiler-plugin.
Call mvn compiler:help -Ddetail=true -Dgoal=<goal-name> to display parameter
details.
compiler:testCompile
Compiles application test sources.
またcompiler:help
のところに書かれていますが、更に特定のゴールに関する詳細を見ることも可能です。
ゴールの詳細ではパラメーターの説明が見られます。
プラグインの設定を書くときに便利です……プラグインをググって公式ドキュメントへ辿り着くのとどちらが早くて便利かはわかりませんが!
あとmaven-help-pluginも役立つときがあるので、存在を頭の片隅に置いておくことをオススメします(力尽きたので説明は割愛します、、、)。
おわりに
実際に手を動かしているときはもっといろいろやっているような気もしますが、リラックスしているときに思い出せる小ネタはとりあえずこんなところです。
以上です。