使用 ivy 解决相同依赖关系中的两个工件
Resolve two artifacts in same dependency using ivy
我在使用 ivy 解决 kafka 依赖项时遇到问题。
我正在尝试在 junit 测试中创建一个 kafka 服务器。
TestUtils.createServer(kafkaConfig, Time.SYSTEM);
这需要 kafka_2.11-0.10.2.1.jar
、kafka-clients-0.10.2.1-test.jar
和 kafka_2.11-0.2.1-test.jar
在测试 class 路径上,因为 kafka.utils.TestUtils
在 *-test.jar
中.问题是如何使用 ivy 和 ant 解决 *-test.jar
?在 ivy.xml
我有:
<configurations defaultconfigmapping="default>
<conf name="compile"/>
<conf name="test" extends="compile"/>
<conf name="master"/>
<conf name="sources"/>
<conf name="javadoc"/>
<conf name="runtime" extends="compile"/>
<conf name="default" extends="master,runtime"/>
</configurations>
...
<dependency org="org.apache.kafka" name="kafka-clients" rev="0.10.2.1" conf="compile->default"/>
<dependency org="org.apache.kafka" name="kafka_2.11" rev="0.10.2.1" conf="test->default">
<artifact name="kafka_2.11" ext="jar"/>
<artifact name="kafka_2.11" e:classifier="test" ext="jar"/>
</dependency>
<dependency org="org.apache.kafka" name="kafka-clients" rev="0.10.2.1" conf="test->default">
<artifact name="kafka-clients" ext="jar"/>
<artifact name="kafka-clients" e:classifier="test" ext="jar"/>
</dependency>
构建有类似的内容
<ivy:resolve log="quiet" conf="compile" transitive="false"/>
<ivy:cachepth pathid="test-classpath" conf="test" log="quiet"/>
这导致 NoClassDefFoundError org/apache/kafka/test/TestUtils
。
我注意到 conf 设置为 "compile",但是当我将测试添加到列表时,我收到其他错误,因为缺少 classes.
不要将传递依赖解析设置为 false。您将失去使用常春藤的主要好处之一。
改为在每个依赖项中创建配置映射。
示例
以下人为设计的示例将依赖项保存在单独的目录中,以说明哪些 jar 位于所需的类路径中。如您所见,kafka 客户端 jar 与它们所依赖的 jar(传递依赖)一起下载。
├── build.xml
├── ivy.xml
└── target
└── lib
├── compile
│ ├── kafka-clients-0.10.2.1.jar
│ ├── lz4-1.3.0.jar
│ ├── slf4j-api-1.7.21.jar
│ └── snappy-java-1.1.2.6.jar
└── test
├── kafka-clients-0.10.2.1.jar
├── kafka-clients-test-0.10.2.1.jar
├── lz4-1.3.0.jar
├── slf4j-api-1.7.21.jar
└── snappy-java-1.1.2.6.jar
build.xml
检索任务用于保存"target/lib"目录下的文件。 ivycachepath 任务用于创建具有适当文件的 ANT 缓存。
<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="build">
<ivy:retrieve pattern="${build.dir}/lib/[conf]/[artifact](-[classifier])-[revision].[ext]"/>
<ivy:cachepath pathid="compile-classpath" conf="compile"/>
<ivy:cachepath pathid="test-classpath" conf="test"/>
</target>
</project>
ivy.xml
神奇之处在于配置映射 "compile->default" 或 "test->default"。
<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="test" description="Additional test dependencies" extends="compile"/>
</configurations>
<dependencies>
<!-- compile dependencies -->
<dependency org="org.apache.kafka" name="kafka-clients" rev="0.10.2.1" conf="compile->default"/>
<!-- test dependencies -->
<dependency org="org.apache.kafka" name="kafka-clients" rev="0.10.2.1" conf="test->default">
<artifact name="kafka-clients"/>
<artifact name="kafka-clients" e:classifier="test"/>
</dependency>
</dependencies>
</ivy-module>
我在使用 ivy 解决 kafka 依赖项时遇到问题。
我正在尝试在 junit 测试中创建一个 kafka 服务器。
TestUtils.createServer(kafkaConfig, Time.SYSTEM);
这需要 kafka_2.11-0.10.2.1.jar
、kafka-clients-0.10.2.1-test.jar
和 kafka_2.11-0.2.1-test.jar
在测试 class 路径上,因为 kafka.utils.TestUtils
在 *-test.jar
中.问题是如何使用 ivy 和 ant 解决 *-test.jar
?在 ivy.xml
我有:
<configurations defaultconfigmapping="default>
<conf name="compile"/>
<conf name="test" extends="compile"/>
<conf name="master"/>
<conf name="sources"/>
<conf name="javadoc"/>
<conf name="runtime" extends="compile"/>
<conf name="default" extends="master,runtime"/>
</configurations>
...
<dependency org="org.apache.kafka" name="kafka-clients" rev="0.10.2.1" conf="compile->default"/>
<dependency org="org.apache.kafka" name="kafka_2.11" rev="0.10.2.1" conf="test->default">
<artifact name="kafka_2.11" ext="jar"/>
<artifact name="kafka_2.11" e:classifier="test" ext="jar"/>
</dependency>
<dependency org="org.apache.kafka" name="kafka-clients" rev="0.10.2.1" conf="test->default">
<artifact name="kafka-clients" ext="jar"/>
<artifact name="kafka-clients" e:classifier="test" ext="jar"/>
</dependency>
构建有类似的内容
<ivy:resolve log="quiet" conf="compile" transitive="false"/>
<ivy:cachepth pathid="test-classpath" conf="test" log="quiet"/>
这导致 NoClassDefFoundError org/apache/kafka/test/TestUtils
。
我注意到 conf 设置为 "compile",但是当我将测试添加到列表时,我收到其他错误,因为缺少 classes.
不要将传递依赖解析设置为 false。您将失去使用常春藤的主要好处之一。
改为在每个依赖项中创建配置映射。
示例
以下人为设计的示例将依赖项保存在单独的目录中,以说明哪些 jar 位于所需的类路径中。如您所见,kafka 客户端 jar 与它们所依赖的 jar(传递依赖)一起下载。
├── build.xml
├── ivy.xml
└── target
└── lib
├── compile
│ ├── kafka-clients-0.10.2.1.jar
│ ├── lz4-1.3.0.jar
│ ├── slf4j-api-1.7.21.jar
│ └── snappy-java-1.1.2.6.jar
└── test
├── kafka-clients-0.10.2.1.jar
├── kafka-clients-test-0.10.2.1.jar
├── lz4-1.3.0.jar
├── slf4j-api-1.7.21.jar
└── snappy-java-1.1.2.6.jar
build.xml
检索任务用于保存"target/lib"目录下的文件。 ivycachepath 任务用于创建具有适当文件的 ANT 缓存。
<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="build">
<ivy:retrieve pattern="${build.dir}/lib/[conf]/[artifact](-[classifier])-[revision].[ext]"/>
<ivy:cachepath pathid="compile-classpath" conf="compile"/>
<ivy:cachepath pathid="test-classpath" conf="test"/>
</target>
</project>
ivy.xml
神奇之处在于配置映射 "compile->default" 或 "test->default"。
<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="test" description="Additional test dependencies" extends="compile"/>
</configurations>
<dependencies>
<!-- compile dependencies -->
<dependency org="org.apache.kafka" name="kafka-clients" rev="0.10.2.1" conf="compile->default"/>
<!-- test dependencies -->
<dependency org="org.apache.kafka" name="kafka-clients" rev="0.10.2.1" conf="test->default">
<artifact name="kafka-clients"/>
<artifact name="kafka-clients" e:classifier="test"/>
</dependency>
</dependencies>
</ivy-module>