65

状況は、同じ構造を持つ 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>親グループ ID</groupId>
    <artifactId>親アーティファクト ID</artifactId>
    <version>親バージョン</version>
    <packaging>pom</packaging>
    <name>親の名前</name>
    <モジュール>
        <module>module-1</module>
        <module>module-2</module>
    </モジュール>
</プロジェクト>
4

4 に答える 4

53

ビルド順序は Maven リアクターによって決定されます。これは、プロジェクトをソートすることによって、マルチモジュール ビルドの正しいビルド順序を自動的に保証するメカニズムです。

それがどのように機能するかについては、公式ドキュメントを参照してください。

それは言います:

プロジェクトを並べ替えるときは、次の関係が考慮されます。

  • ビルド内の別のモジュールに対するプロジェクトの依存関係
  • プラグインがビルド内の別のモジュールであるプラグイン宣言
  • ビルド内の別のモジュールへのプラグインの依存関係
  • ビルド内の別のモジュールでのビルド拡張宣言
  • 要素で宣言された順序 (他の規則が適用されない場合)

ビルド順序を手動で制御することはできません。順序を変更したい場合は、プロジェクトに変更を加えて、リアクターの並べ替え順序に影響を与える必要があります。

于 2012-06-21T04:57:02.767 に答える
14

大まかに言うと、ビルド順序はモジュール依存関係グラフのトポロジー ソートに基づいています。

編集:あなたへの質問。プロジェクト 1 には 2 つのモジュールが含まれており、プロジェクト 2 も含まれていることを理解しています。しかし、プロジェクト 2 のモジュールは、「親」pom を親として明示的に宣言していますか? おそらく、プロジェクト 1 モジュールは親 pom を明示的に宣言し、プロジェクト 2 モジュールはそうではないと考えています。つまり、プロジェクト 2 の「親」は実際にはまったく親ではないため、モジュールの前にビルドする必要はありません。とにかくそれは私の推測です。

于 2012-06-21T05:00:48.003 に答える
8

最近、CentOS 7 でこの問題が発生しています。Maven を 3.0.5 から 3.5.3 に更新したところ、問題は解決しました。誰かがこの問題を抱えている場合は、最初にそれを試すことができます。

于 2018-05-30T10:55:48.817 に答える