私は仕事上、OpenJDK, Quarkus, Wildflyなど大規模なJavaのOSSをビルドして検証・バグ修正・不足機能を開発することがよくあります。 これらは大規模すぎるため、全体をビルドすると何時間もかかります。 このビルド時間は、使用しないモジュールのビルドや各モジュールでのテストも含んでいます。
時短の方法はいろいろあります。 その方法を自分のメモにしか記録していなかったため、バックアップも兼ねてここに残しておきます。 それぞれの要素は組み合わせもできます。
「他にもあるよ」という方がいらっしゃれば今後のために教えて頂けると助かります。
ここにあるものを試しても遅い場合は、速くてコアの多いCPU、高速なインターネット、IOPSの高いSSDを導入してください・・・
Lifecycleはinstall
にしていますが他でも大丈夫です。
使いたいモジュールが依存するものだけを対象に
まずは、自分が使いたいモジュールと、そのモジュールが依存しているモジュールだけをビルドしてローカルのリポジトリへインストールします。
mvn install -pl <使いたいモジュールまでのパス> -am
自分が使いたいモジュールは-pl
で指定します。
-pl
は--projects
の短縮形です。
自分が使いたいモジュールが依存しているモジュールを含めてビルドするには-am
を使用します。
-am
は--also-make
の短縮形です。
ビルドが失敗した後に失敗したところからやり直す
ビルドを実行すると、だいたいどこかで失敗します。 失敗しても、これまでコンパイルしたクラスやダウンロードしたものがあります。 失敗したときに、また最初からビルドすればそれらを活用できるため、1度目よりは早く失敗した箇所へ戻れるでしょう。 しかしながら、それでも時間はかかるので、失敗したところから再開します。
mvn install -rf :ビルドを再開したいモジュール
再開するときに使うのが-rf
です。
-rf
は--resume-from
の短縮形です。
テストを省略
テストは重要です。 しかしながら、検証するときはテストをしたい訳ではありません。 特に、最初に検証するときにはテストをスキップしたいでしょう。
mvn install -DskipTests
テストをスキップする時に使うのは-DskipTests
です。
ただし、test
ライフサイクルと一緒に使うとテストが実行されないので注意してください。
ビルドに不要なものを全部省略
私がよく触っているQuarkusですと、できるだけ高速にビルドするオプションが用意されています。
mvn install -Dquickly
なるべく高速にビルドしたいときに使うのは-Dquickly
です。
これはテストの実行やコンパイルなどいろんなものを省いてくれます。
これも、test
ライフサイクルと一緒に使うとテストが実行されないので注意してください。
ルートディレクトリからモジュールをインストール
一度全体のビルドが済むと、いくつかの特定のモジュールだけを修正することになります。
毎回ディレクトリを移動していると自分がどこにいるのか把握するのは難しいです。
ビルドしたと思ったら別のモジュールだったということが良くあり、時間の無駄になります。
カレントディレクトリはgit clone
した直下にしたまま、それぞれのモジュールをビルドしましょう。
mvn -f <モジュールまでのパス> clean install
ここではclean
も付けています。
モジュールを修正すると、.java
ファイルを削除することがあります。
しかしながら、コンパイル済みの.class
ファイルは残っています。
これによって消したはずのクラスが読み込まれます。
それを避けるため、clean
を付けましょう。
clean し忘れてて、既に存在しないクラスの残骸が読み込まれていた・・・
— Chihiro Ito (@chiroito) 2023年12月13日