3

我有一个用 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

模块 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 一起工作:)。

4

1 回答 1

2

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

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

于 2013-09-03T05:56:49.850 回答