使用 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.jarkafka-clients-0.10.2.1-test.jarkafka_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>