【问题标题】:Get classpath for integration tests of multi-module project with maven-ant-task使用 maven-ant-task 获取多模块项目集成测试的类路径
【发布时间】:2013-09-02 01:18:26
【问题描述】:

我有一个用 maven 构建的多模块项目。我需要每天运行项目的集成测试。在标准的 maven 构建周期中不可能这样做,因为在运行时模块中定义的集成测试具有循环依赖关系,我在它们的 pom 上声明这是非法的。

相反,我创建了一个名为 Global 的单独项目,其中列出了所有模块 jars 和 test-jars 作为其依赖项。 Global 与所有模块具有相同的父级。这个想法是,使用 maven-ant-tasks 我将能够获得所有模块 jars 和 test-jars 的类路径并从那里继续。 Global的pom.xml依赖部分如下:

<dependency>
    <groupId>mygroup</groupId>
    <artifactId>A</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>mygroup</groupId>
    <artifactId>A</artifactId>
    <version>${project.version}</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>mygroup</groupId>
    <artifactId>B</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>mygroup</groupId>
    <artifactId>B</artifactId>
    <version>${project.version}</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>

...etc

问题是我似乎无法使用可用的 ant 任务获得包含在 Global 的 pom.xml (及其运行时依赖项)上声明的所有 jars 和 test-jars 的类路径。我已经尝试过(除其他外):

<dependencies pathId="cp1" type="jar" usescope="runtime">
    <pom file="${basedir}/pom.xml">
        <profile id="DEV" />
    </pom>
</dependencies>

[1] 这个获取所有运行时依赖项。没有错。

<dependencies pathId="cp2">
    <dependency groupId="mygroup" artifactId="Global" version="myVersion" scope="test" type="test-jar"/>
</dependencies>

[2] 这个获取所有运行时依赖项以及 Global-myversion-tests.jar,但没有其他 test-jar。

<dependencies pathId="cp3" type="test-jar" usescope="test">
    <pom file="${basedir}/pom.xml">
        <profile id="DEV" />
    </pom>
</dependencies>

[3] 这个一无所获。

显然,为每个模块声明类似 [2] 一次就可以解决问题,但我希望创建一个不需要在每次添加或删除新模块时编辑大量文件的设置。顺便说一句,我正在使用 maven-ant-task-2.1.3。

感谢您的任何意见。

---编辑@yannisf 接受的答案---

你不应该有循环依赖

我假设您的意思是 Maven 构建。对运行时有循环依赖是很常见的,例如:

模块A声明接口:UploadToDocumentManagementSystem

Module B 在 : UploadToCoolDms 中实现它(这样将来当 DMS 系统更改为 CoolerDms 时,模块 B 可以被替换为新的实现,对应用程序的其余部分没有副作用)。

模块 B 依赖于 A 编译时间(根据定义,运行时也是如此)

模块 A 在运行时依赖于 B

Maven 不允许这样声明。我可以同情的原因是,maven 需要按特定顺序完成多模块项目的构建周期(包括测试)。问题是,如果您摆脱对 B 的任何运行时依赖以进行 A 的测试,则实际上没有必要声明它(这是一种很好的做法,无论如何都应该发生)。

你应该以 maven 的方式做事,而不是求助于 ant-tasks

公平地说,我可以看到 maven-ant-tasks 不是为此用途而设计的。

在您的全局 pom 中,您为同一个工件(jar、test-jar)声明双重类型

这是一个普遍的问题吗?例如,模块 A 包含一些我想在模块 B 的测试中使用的测试样本。声明 B 依赖于 A jar (编译范围)和 A test-jar (测试范围)是错误的(根据 maven 最佳实践标准)吗?集成测试项目难道不能证明依赖一个模块以及用于其单元测试的相同模块的示例和资源是合理的吗?

tl;dr 版本:我将尝试重新排列模块上声明的测试,并为集成测试创建单独的模块(假设我可以让 20 个开发人员参与其中)。感谢您的回答,让我承认失败并停​​止尝试让 maven 与项目一起工作,而不是让项目与 maven 一起工作:)。

【问题讨论】:

    标签: java maven ant continuous-integration maven-ant-tasks


    【解决方案1】:

    您正试图以多种方式打破 maven 约定。 1. 你不应该有循环依赖, 2. 你应该以 maven 方式做事,而不是诉诸 ant-tasks 3. 在你的全局 pom 中,你为同一个工件(jar,test-jar)声明双重类型。

    虽然起初这似乎无法回答您的问题,但您应该退后一步,重新考虑您的布局。集成测试需要所有依赖项,并且比单元测试要求更高。因此,与其尝试将它们放入现有项目中,不如在同一组中创建一个单独的 maven 项目,该项目将仅托管集成测试(在 src/java/test 下,main 将为空白)并将所有其他项目作为依赖项项目。

    【讨论】:

    • 很公平。问题是,这是一个 3 年前的项目,我刚刚“mavenized”,所以真的没有太大的回旋余地。感谢您花时间回答这个问题。
    • 接受。我在问题的最后做了一些修改。感谢您快速浏览一下。再次感谢。
    • [1]运行时依赖“模块 A 在运行时依赖于 B”是由容器实现的松散依赖,它将“自动检测”接口的实现(或在 spring 的情况下读取 XML )。编译时间依赖是最重要的,maven 不会接受循环。即使你欺骗了 maven,它也会很脆弱,难以维护和不正统。 [2] 酷。 [3] 测试的公共部分最好移到单独的模块中,该模块将作为测试依赖项包含在所有其他项目中。
    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 2021-07-22
    • 1970-01-01
    • 2019-06-03
    • 2014-10-13
    • 2018-04-19
    • 2010-12-16
    相关资源
    最近更新 更多