使用常春藤

时间:2017-07-31 20:53:39

标签: java ant apache-kafka 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被设置为“compile”但是当我将测试添加到列表中时,我会因缺少类而得到其他错误。

1 个答案:

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

的build.xml

检索任务用于将文件保存在&#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>

的ivy.xml

神奇之处在于配置映射&#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>