当前位置: 首页 > 面试题库 >

如何减去IVY依赖集

孟栋
2023-03-14
问题内容

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

  • 系统(j2ee容器中已经存在的jar;以明确的固定版本手动列出)
  • 提供(将jar复制到j2ee容器;手动列出)
  • 耳朵(jar包装在耳朵/耳塞里,其余)

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

  • 必须逐一从耳朵会议中排除系统和提供的库
  • 尚未明确排除的新的第三方传递性部门可能会意外出现
  • 有时必须添加显式override复制的库名称和版本

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

能够以某种方式定义一个conf作为依赖集减去另一个conf(具有优美的冲突解决方案)的结果将是一件好事: ear = runtime-system-
providered

也许<conf name="ear" extends="runtime,!system,!provided"/>当符号可以支持IVY-982得到固定。

寻找适用的实际解决方案。

如果有解决方案,甚至愿意考虑切换到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和Gradle排除提供的依赖项,但似乎目前尚无办法使用ivy轻松实现。

更新资料

在某些情况下,可以使用中间生成的模块和负的正则表达式掩码来解决此任务:

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

但是由于常春藤似乎正在失去动力,我们已经搬到Gradle。



 类似资料:
  • 使用公共存储库和 Apache Ant 共享其他项目的源代码 管理项目和工具之间的源代码依赖项往往非常困难,但并不一定总是如此。在这一期“ 让开发自动化”中,自动化专家 Parl Duvall 介绍了如何利用 Apache Ant 项目中的 Ivy 依赖项管理器来处理所有重要 Java 项目必须管理的无数依赖项。 实际上,所有软件开发项目都必须依靠来自其他项目的源代码。例如,许多项目可能依靠 lo

  • Ivy可以解决依赖关系的依赖关系,留档说可以使用模块配置来告诉Ivy配置取决于依赖关系的给定配置。 我想在一个项目中使用htmlunit,在它的sourceforge页面依赖信息中我找到了依赖设置,我把maven规范翻译成ivy: 我写了一个测试,编译了它,当尝试运行它时,我有一个ClassNotFoundException,我再次返回sourceforge,查找关于htmlunit依赖关系的信息

  • 我在我的build.xml中创建了一个taskdef,它依赖于驻留在Ivy导入的jar中的类。 我想了解这是否可能,因为我的构建在开始之前会中断,因为它找不到 taskdef 的类。 这似乎是一个鸡蛋和鸡肉的问题,因为我不能得到这个类,因为我必须首先解决我的依赖关系(这需要构建工作)。

  • 我遇到了一件奇怪的事。我用常春藤检索标签把罐子放在某处。如果我编写如下代码: 它工作正常。但是如果我添加如下内容: 它会抛出“无法解析依赖关系”。有什么建议吗?谢了。

  • 我给ivy添加了一个依赖项(我们称之为a)。在maven central中具有pom文件的xml。Ivy使用ibiblio来解析maven依赖项。添加到常春藤中的依赖项(A)。xml具有可传递依赖项(B)。到目前为止,一切都很好。传递依赖(B)的依赖(C)不能用常春藤来解决。 我在常春藤上定义了一个新的名字。如下所示的xml: 在B的pom文件中,C在编译和测试范围中定义如下: 当我在ivy的缓存

  • 我对ivy没有解析我的一些依赖关系有问题。以下是我如何重现这个问题的: 我在eclipse中有一个空的java项目。我已经在我的项目中添加了ivy.xml: 这工作正常,ivy能够解决和下载口水。 如果我将修订版更改为6.3.0.Final(http://mvnrepository.com/artifact/org.drools/drools-core/6.3.0.Final),它将不起作用,我看