Mavenでビルドを高速化する方法

メイブン

Mavenでのビルドが遅すぎる場合はどうなりますか? 結局のところ、アセンブリに時間がかかりすぎると、誰でも、最も忍耐強い開発者でさえも、退屈して気を散らす可能性があります。



Googleでのクイック検索やブックマークのために、すぐに最終的なソリューションを提供します。

mvn package -am -o -Dmaven.test.skip -T 1C
      
      





- テストなしでプロジェクトをビルドします



この話は、私たちの会社のリポジトリからかなり大きなJavaプロジェクトをダウンロードしたという事実から始まりました。 私と同じように、多くの人がすぐにチームでそれを組み立てると思います:

 mvn clean package
      
      





さて、多くのチーム:

 mvn clean install
      
      





私のプロジェクトは25分で組み立てられ、そのたびに初めてのように時間がかかりました。



インストールの代わりにパッケージ



プロジェクトアセンブリのライフサイクルに従って、本格的なjarファイルを取得するパッケージフェーズの後に、検証フェーズがあり、インストールします。 多くの場合、ローカルリポジトリに配置する必要のないjarファイルを取得する必要があるため、この状況でパッケージを停止して少し時間を節約しました。



並列組立



通常の起動中、Mavenは最新のプロセッサのすべての機能を使用して、異なるコアで計算を並列化し、モジュールを1つずつ組み立てません。 幸いなことに、-Tオプションを使用して、依存関係グラフを作成し、モジュールを並行して作成する必要があることをMavenに伝えることができます。

パラメーターはさまざまな方法で使用できます。

 mvn -T 4 package
      
      





または

 mvn -T 1C package
      
      





最初のケースでは、Mavenを使用するスレッドの数を指定し、2番目のケースでは、CPUコアごとに1つのスレッドを使用する必要があります。

コアの数に関係するパラメーターを設定する2番目の方法は、最終チームで使用する予定です。

コアあたりのスレッド数を試して、次のオプションを試してみてください。

 mvn -T 1C package mvn -T 1.5C package mvn -T 2C package
      
      





-Core i7プロセッサでビルドされているプロジェクトで、コアあたり1スレッド以上の場合、目立った増加はありませんでした。

また、並列アセンブリはMaven 3の実験的な機能であることに注意してください。アセンブリ中に、@ threadSafe以外のプラグインを使用すると問題が発生する場合があります。 特に、これらはプラグインです:



およびライブラリ:





インクリメンタルアセンブリ



上記で説明したように、プロジェクトはほとんどの場合、チームによって組み立てられます。

 mvn clean package
      
      





cleanコマンドはプロジェクトをクリーンアップするために使用されますが、ビルドするたびに必要ですか? いいえ、通常、プロジェクトの増分更新が必要です。Mavenは次のコマンドでこれを実行できます。

 mvn package -am
      
      





Mavenはモジュールをビルドし、このモジュールが依存しているモジュールを更新します(何か変更されている場合)。

このオプションにより、多くのモジュールからのプロジェクトのアセンブリが大幅に加速されます。原則として、ポイントの変更は1-2モジュールで行われます。



オフラインアセンブリ



外部リポジトリのアーティファクトは、特に特定のバージョンのアーティファクトである場合、またはこれらのアーティファクトがあなたの努力によってサポートされる必要がある場合(-新しいプロジェクトへようこそ!)、特に頻繁に更新されないことがよくあります。 この状況では、Mavenにリポジトリから毎回ダウンロードする必要がないことを伝えるのは非常に理にかなっています。

 mvn package -o
      
      





または

 mvn package --offline
      
      







簡潔にするため、最初のオプションに焦点を当てます。



テストをスキップする



おそらく、私が最後に残したアセンブリ速度を最適化するための最も議論の余地のある提案でしょう。 TDDの値を完全に共有する場合は、この段落をスクロールして、最終コマンドから-Dmaven.test.skipパラメーターを削除することをお勧めします。

私はテストが確かに必要であることを否定しません、そして、プログラマーは彼がそれらを無効にすることによって彼自身に負う責任の部分を理解しなければなりません。 しかし、誰かがかつてテストを書いた新しい巨大なプロジェクトに突然出くわし、それらが機能しない場合は、開始のためにそれらをオフにする必要があります。

Mavenの起動オプションについては、原則として、コマンドを使用してテストをスキップすることにのみ注意します。

 mvn package -DskipTests
      
      





ただし、次の形式でコマンドを実行する場合は、テストのコンパイルをスキップすることもできます。

 mvn package -Dmaven.test.skip
      
      







まとめると



したがって、Mavenを使用してビルドを高速化するために再度取得したコマンドは次のとおりです。

 mvn package -am -o -Dmaven.test.skip -T 1C
      
      







私が組み立てているプロジェクトに示されている結果は、喜ばしいことです。25分ではなく、30秒で組み立てが開始されました。

Mavenを使用したビルド速度の最適化に関する他の記事の著者も、コンパイラー起動最適化オプションの使用を推奨しています。

 MAVEN_OPTS= -XX:+TieredCompilation -XX:TieredStopAtLevel=1 mvn package
      
      





-しかし、最初は、アセンブリの実際の加速を感じていませんでした。明らかに、すでにインクリメンタルアセンブリを使用しており、この場合はコンパイルプロセスにそれほど時間がかからなかったためです。これらのパラメーターがOutOfMemoryエラーやその他の問題を引き起こす可能性があるという事実への十分な参照があります。



コメントで、プロジェクトのアセンブリを加速するための統計情報を共有することを願っています!



All Articles