使用 ivy 解析同一依赖项中的两个项目



我在使用 ivy 解析 kafka 依赖项时遇到问题。

我正在尝试在 junit 测试中创建 kafka 服务器。

TestUtils.createServer(kafkaConfig, Time.SYSTEM);

这要求kafka_2.11-0.10.2.1.jarkafka-clients-0.10.2.1-test.jarkafka_2.11-0.2.1-test.jar在测试类路径上,因为kafka.utils.TestUtils*-test.jar中。问题是如何使用常春藤和蚂蚁解决*-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 设置为"编译",但是当我将 test 添加到列表中时,我收到缺少类的其他错误。

不要将传递依赖项解析设置为 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

构建.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>

常春藤.xml

神奇之处在于配置映射"编译>默认"或"测试>默认值"。

<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>

相关内容

  • 没有找到相关文章

最新更新