⛄️

Mavenでたまに役立つ小ネタ

2021/02/11に公開

実際に作業しているときにちょくちょく役立つ小ネタです。

ビルド時の小ネタ

ビルド時に-DskipTestsでテストの実行をスキップすることは皆さんよくやると思います(?)。

同じように-Dmaven.test.skipでもテストの実行をスキップできますが、こちらはテストコードのコンパイルもスキップするのでテストコードがコンパイルエラーになっていても大丈夫です(??)。

更にmvn package -Dmaven.test.skipを実行してもtestスコープの依存関係が壊れている場合(依存解決できない場合。Mavenセントラル以外のリポジトリを参照しているプロジェクトなんかでまれによくある)はビルドエラーになってしまいます。
そういった場合はmvn packageせず、mvn compile jar:jarpackagingwarの場合は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 --helpmvnコマンドのヘルプが見られますが、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も役立つときがあるので、存在を頭の片隅に置いておくことをオススメします(力尽きたので説明は割愛します、、、)。

おわりに

実際に手を動かしているときはもっといろいろやっているような気もしますが、リラックスしているときに思い出せる小ネタはとりあえずこんなところです。

以上です。

Discussion