使用ivy解析同一依赖关系中的两个工件

1aaf6o9v  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(303)

我用常春藤解决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”,但是当我将test添加到列表中时,我得到了关于缺少类的其他错误。

ltskdhd1

ltskdhd11#

不要将可传递依赖项解析设置为false。你会失去使用常春藤的一大好处。
而是在每个依赖项中创建配置Map。

示例

下面的人为示例将依赖关系保存在单独的目录中,以说明哪些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

神奇之处在于配置Map“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>

相关问题