クラスの1つだけを変更した場合でも、Mavenは常にすべてのクラスを再コンパイルします。私はこのプラグイン構成を使用します:
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<staleMillis>1</slateMillis>
<useIncrementalCompilation>true</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
これは、mvn compile
、mvn package
、およびmvn install
で発生します。
もちろん、10〜15個のファイルがある場合、これは問題ではありません。しかし、私は1000を超えるソースファイルを持っており、時間がかかります。
Mavenコンパイラプラグインには、変更されたファイルのみを再コンパイルするための非表示の設定がいくつかありますか?回避策はありますか?
https://issues.Apache.org/jira/browse/MCOMPILER-209
ブルガリア語の表記で使用します(はい<->いいえ)
<useIncrementalCompilation>false</useIncrementalCompilation>
は真を意味し、その逆も同様です。
canはMavenに「変更されたファイルのみを再コンパイルする」ように指示できますが、そうすると間違った結果になります。デフォルトの動作はバグではなく、意図的な設計上の決定です。
useIncrementalCompilation
が実際に行うことこのトピックに関するドキュメントは、控えめに言っても、最適ではありません。これが実際に起こることです( AbstractCompilerMojo source from maven-compiler-plugin
3.3に基づく):
useIncrementalCompilation
をfalse
に設定(非推奨)useIncrementalCompilation
をtrue
に設定(default)Changes detected - recompiling the module!
を出力します。したがって、要約すると、useIncrementalCompilation
は常にデフォルトのtrue
のままにしておく必要があります。
当然のことながら、プラグインが変更の影響を受けるクラスを判別せず、それらのクラスのみを再コンパイルするのはなぜですか? MCOMPILER-205 に関するコメントで、Maven開発者のRobert Scholteは 簡単な理論的根拠 以降 確認済み 次の詳細な説明をしました。
ソースファイルが変更または削除された場合、すべてのファイルが削除され、再コンパイルされます。この理由は、デフォルトのJavaコンパイラですべてを再コンパイルするだけで非常に高速であり、おそらく次のように見える代替よりもはるかに高速であるためです。
- 変更されたすべてのファイルを検出する
- すべてのソースファイルを分析して、クラス間のすべての関係をマッピングします
- 影響を受けるすべてのファイルを計算する
- 影響を受けるファイルを再コンパイルする
ただし、Robertも writes であるため、プロジェクトでこの分析を行うEclipseコンパイラを使用している場合は、すべてを再コンパイルする必要はおそらくありません。しかし、今日のMavenユーザーにとって、これは重要なポイントです。maven-compiler-plugin
は、コンパイラーの選択に基づいてその動作をまだ変更していないからです。