我在使用 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
在测试类路径上,因为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>