如何减去常春藤依赖集

Posted

技术标签:

【中文标题】如何减去常春藤依赖集【英文标题】:How to subtract ivy dependency sets 【发布时间】:2013-10-14 03:42:08 【问题描述】:

我的目标是将项目传递依赖关系划分为几个不交叉的集合:

系统(j2ee 容器中已存在 jar;手动列出的明确固定版本) 提供(要复制到 j2ee 容器的 jar;手动列出) ear(罐子装在 ear/lib 内,其余的)

下面列出的我目前的解决方案有一些缺点:

必须从 ear conf 中逐一排除系统和提供的库 尚未明确排除的新的第三方传递部门可能会意外听到 有时必须添加明确的override 复制库名称和版本

有什么办法可以消除这些缺点吗?

如果能够以某种方式定义一个 conf 作为依赖集减去其他 conf 的结果(通过优雅的冲突解决),那就太好了: ear = 运行时 - 系统 - 提供

当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 附件中找到要试验的示例项目源。

【问题讨论】:

如果您不知道解决方案但认为此类功能请求有用,请投票支持此评论。沉默让我害怕。 ) 这就是使用 maven 提供排除的方式:***.com/questions/1459021/… 而且似乎可以使用 gradle:***.com/questions/15507215/… 【参考方案1】:

虽然 Maven 和 Gradle 可以排除提供的依赖项,但目前似乎无法通过 ivy 轻松实现。

更新

在某些情况下,可以使用中间诱导模块和negative regexp 掩码来解决该任务:

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

但我们已经转移到 Gradle,因为 Ivy 似乎正在失去动力。

【讨论】:

以上是关于如何减去常春藤依赖集的主要内容,如果未能解决你的问题,请参考以下文章

如何解决具有不同包装常春藤类型的sbt中的依赖关系?

常春藤:强制依赖本地快照

阿帕奇常春藤。未检索到传递依赖项

Gradle - 将第三方依赖项安装到本地常春藤存储库中

如何避免使用 Ivy 复制依赖项

常春藤不使用分类器拉动对 jar 的传递依赖