#chiroito ’s blog

Java を中心とした趣味の技術について

Mavenを使用している大規模OSSのビルド時間を短縮するメモ

私は仕事上、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を付けましょう。

参考

Maven – Guide to Working with Multiple Modules in Maven 4

Maven Surefire Plugin – Skipping Tests

Javaで16進数の乱数を生成

Java で32桁の16進数の乱数を簡単に作りたいなと思ったので作ってみたメモ。

byte[] bytes = new byte[16];
SecureRandom random = new SecureRandom();
random.nextBytes(bytes);
String hexString = HexFormat.of().formatHex(bytes);

これで変数 hexString には 7ffda83291c2b5e47db3557138ef7799 のような文字列が入ります。

16進数の 1 桁は 4 bit で、byte は 8 bitです。なので、欲しい桁の半分のbyte配列を作成します。

SecureRandomのパラメータとかは必要に応じて良い感じに設定すると良いと思います。