我无法使用常春藤解析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被设置为“compile”但是当我将测试添加到列表中时,我会因缺少类而得到其他错误。
答案 0 :(得分:0)
不要将传递依赖性解析设置为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
检索任务用于将文件保存在&#34; target / lib&#34;目录。 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>
神奇之处在于配置映射&#34; compile-&gt; default&#34;或&#34; test-&gt;默认&#34;。
<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>