状況は、同じ構造を持つ2つのMavenマルチモジュールプロジェクトがあることです。
親 -モジュール1 -モジュール2
プロジェクト1をビルドすると、親が最初にビルドされることがわかります(順序はparent-> module1-> module2です)。ただし、プロジェクト2では、最後に親が構築されます(順序はmodule1-> module2-> parentです)。 2つのプロジェクトのビルド順序が異なるのはなぜですか?さらに、ビルド順序を手動で制御するにはどうすればよいですか?
更新1:
親プロジェクトはどちらもソースコードのない単純なPOMプロジェクトなので、依存関係グラフに従ってビルド順序を説明することはできません。
更新2:
親POMは、GAVと子モジュール名を除いて同じです。
<?xml version = "1.0" encoding = "UTF-8"?> <project xmlns = "http://maven.Apache.org/POM/4.0.0" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd /maven-4.0.0.xsd"> <modelVersion> 4.0.0 </ modelVersion> <groupId> parent-group-id </ groupId> <artifactId> parent-artifact-id </ artifactId> <version> parent-version </ version> <packaging> pom </ packaging> <name> parent-name </名前> <モジュール> <モジュール>モジュール-1 </モジュール> <モジュール>モジュール-2 </モジュール> </モジュール> </ project>
ビルド順序はMavenリアクターによって決定されます。これは、プロジェクトをソートすることにより、マルチモジュールビルドの正しいビルド順序を自動的に保証するメカニズムです。
公式ドキュメント をご覧ください。
それは言います:
プロジェクトを並べ替えるときは、次の関係が尊重されます。
- ビルド内の別のモジュールへのプロジェクトの依存関係
- プラグインがビルド内の別のモジュールであるプラグイン宣言
- ビルド内の別のモジュールのプラグイン依存関係
- ビルド内の別のモジュールのビルド拡張宣言
- 要素で宣言された順序(他の規則が適用されない場合)
ビルドの順序を手動で制御することはできません。順序を変更する場合は、リアクタの並べ替え順序に影響するプロジェクトを変更する必要があります。
高レベルでは、ビルド順序はモジュール依存関係グラフの トポロジカルソート に基づいています。
EDIT:質問。プロジェクト1には2つのモジュールが含まれ、プロジェクト2にも含まれることを理解しています。しかし、プロジェクト2のモジュールは「親」pomを明示的に親として宣言しますか?おそらくあなたのプロジェクト1モジュールは親pomを明示的に宣言し、プロジェクト2モジュールはそうではないと考えています。つまり、プロジェクト2の「親」は実際にはまったく親ではないため、モジュールの前にビルドする必要はありません。とにかくそれは私の推測です。
私は最近、Centos 7でこの問題に取り組んでいます。mavenを3.0.5から3.5.3に更新し、この問題は解決しました。誰かがこの問題を抱えているなら、まずそれを試してください。