我的目标是将项目传递依赖关系划分为几个不交叉的集合:
下面列出的我目前的解决方案有一些缺点:
override
重复库名称和版本是否有一些方法可以消除这些缺点?
能够以某种方式定义一个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附件中找到要试验的示例项目来源。
答案 0 :(得分:3)
虽然Maven和Gradle可以提供依赖项排除,但目前似乎没有办法轻松实现常春藤。
<强>更新强>
在某些情况下,任务可以使用中间诱导模块和negative regexp掩码:
<dependency org="com.company" name="root.module" conf="ear" rev="latest.integration">
<exclude org="^(?!com.company).*$" matcher="regexp"/>
</dependency>
但是我们已经搬到了Gradle,因为Ivy似乎失去了动力。