3

私の目標は、プロジェクトの推移的な依存関係をいくつかの交差しないセットに分けることです。

  • システム (j2ee コンテナーに既に存在する jar; 明示的な修正バージョンで手動でリストされます)
  • 提供 (j2ee コンテナーにコピーされる jar; 手動でリスト)
  • ear (ear/lib の中に詰める瓶、残り)

以下にリストされている私の現在のソリューションには、いくつかの欠点があります。

  • システムと提供されたライブラリをear confから1つずつ除外する必要があります
  • まだ明示的に除外されていない新しいサードパーティの推移的な依存関係が誤って耳に入る可能性があります
  • override明示的な複製ライブラリ名とバージョンを追加する必要がある場合があります

これらの欠点を解消するために可能なアプローチはありますか?

依存関係セットを他のものから差し引いた結果として、何らかの方法で 1 つの conf を定義できるとよいでしょう (適切な競合解決を使用して): ear = runtime - system - provided

IVY-982が修正され<conf name="ear" extends="runtime,!system,!provided"/>たら、記法がサポートされるかもしれません。

適用する実際のソリューションを探しています。

解決策があれば、gradle への切り替えも検討します。

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">

    <info organisation="example.com" module="parent"/>

    <configurations defaultconfmapping="compile->@;runtime->@;system->master;provided->runtime;ear->runtime;test->test(default)">
        <conf name="compile"/>
        <conf name="runtime" extends="compile"/>
        <conf name="ear" extends="runtime" description="Libs to be packed inside ear"/>
        <conf name="provided" description="Libs to copy to j2ee container"/>
        <conf name="system" description="Libs already present in j2ee container"/>
        <conf name="test" extends="ear,provided,system" description="Simulate container environment. Used by unit tests to catch dependency compatibility problems."/>
    </configurations>

    <dependencies>
        <dependency org="log4j" name="log4j" rev="1.2.15" force="true" conf="system"/>
        <dependency org="commons-collections" name="commons-collections" rev="3.1" force="true" conf="system"/>
        <dependency org="commons-lang" name="commons-lang" rev="2.2" force="true" conf="system"/>

        <dependency org="org.apache.velocity" name="velocity" rev="1.7" force="true" conf="provided"/>
        <dependency org="org.slf4j" name="slf4j-api" rev="1.5.6" force="true" conf="provided"/>
        <dependency org="org.slf4j" name="slf4j-log4j12" rev="1.5.6" force="true" conf="provided"/>
        <!-- ... -->

        <dependency name="module1" rev="latest.integration" conf="runtime,ear,provided,test"/>
        <dependency name="module2" rev="latest.integration" conf="runtime,ear,provided,test"/>
        <!-- ... -->

        <exclude org="commons-collections" conf="ear,provided"/>
        <exclude org="commons-lang" conf="ear,provided"/>
        <exclude org="org.apache.velocity" conf="ear"/>
        <!-- TODO: negation not working: https://issues.apache.org/jira/browse/IVY-982 -->
        <!--<exclude org="org.slf4j" conf="*, !provided"/>-->
        <exclude org="org.slf4j" conf="ear,test"/>
        <!-- ... -->

        <override org="org.slf4j" rev="1.5.6"/>
        <override org="commons-collections" module="commons-collections" rev="3.1"/>
        <override org="commons-lang" module="commons-lang" rev="2.2"/>
        <!-- ... -->
    </dependencies>

</ivy-module>

実験用のサンプル プロジェクト ソースは、IVY-1443添付ファイルにあります。

4

1 に答える 1

3

MavenGradleでは提供された依存関係の除外が可能ですが、現在、ivy で簡単に実現する方法はないようです。

アップデート

場合によっては、中間誘導モジュールと負の正規表現マスクを使用してタスクを回避できます。

    <dependency org="com.company" name="root.module" conf="ear" rev="latest.integration">
        <exclude org="^(?!com.company).*$" matcher="regexp"/>
    </dependency>

しかし、Ivy が勢いを失っているように見えるため、すでに Gradle に移行しています。

于 2013-10-14T06:34:31.880 に答える