7

簡略化した次のシナリオがあります。

projectX  ---> projectA ---> projectB

where--->は「依存する」という意味です。

ProjectB は実にシンプルです。依存関係を宣言しません。実際、関連する唯一の部分は次のとおりです。

<packaging>jar</packaging>

projectA の pom.xml で、projectB への依存関係を宣言しました。

<packaging>jar</packaging>
<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>projectB</artifactId>
        <version>1.0.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

そして、projectX の pom.xml には次のものがあります。

<packaging>war</packaging>
<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>projectA</artifactId>
        <version>1.0.0</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

問題は、projectX が projectB で定義されているコンポーネント (クラスなど) を使用する必要があることです。projectA のスコープcompileを projectB に使用するように変更すると、すべてが機能しますが、projectX で war を生成するときに projectB が含まれます。他の部分で projectB を提供しているため、生成された war からこのライブラリを除外する必要があります。プロジェクトの。

実際のシナリオでは、projectA に影響を与える projectB のようないくつかの依存関係があるため、生成された war のサイズを小さくするために、それらを提供済みとして設定したいと考えていますが、projectX はそれらのライブラリで定義されたコンポーネントを使用できません。コンポーネントの例: Spring、Hibernate など

質問: 多くの場所で依存関係を再宣言せずに、クリーンな方法でこれを実現する方法はありますか?

4

1 に答える 1

6

問題は、projectX が projectB で定義されているコンポーネント (クラスなど) を使用する必要があることです。

次に、ProjetB は、providedスコープ内で ProjectX の依存関係になるはずです。依存関係を再宣言すると、Maven がそれを推移的な依存関係として処理する方法が変わります (つまり、次のように言ってその動作をオーバーライドできます: このスコープを持つプロジェクトでこの依存関係が必要です)。

しかし、その後、projectX で war を生成するときに projectB が含まれるので、生成された war からこのライブラリを取り出す必要があります。

providedこれは、スコープ内で再宣言することによって発生しません。または、 ProjectA の ProjectB のスコープを変更してから、 includes /exclusionsを使用してそれらを除外するcompileように構成することもできます。 ただし、そうする前に、意味的に (または要件に関して) ProjectB がProjectA のように設定された理由と、他の消費者プロジェクトへの影響を再確認する必要があります。maven-war-plugin
provided


更新
上記の両方のアプローチがニーズに合う場合があります。あるいは、コメントで示唆されているように、より良いガバナンスとメンテナンス(集中化)に向けて、長期的にはさらなるオプションがより持続可能で明確になる可能性があります。

于 2016-04-26T21:10:21.280 に答える