我有一个用maven构建的多模块项目。我需要每天运行项目的集成测试。在标准的maven构建周期中不可能这样做,因为在运行时,模块中定义的集成测试具有循环依赖性,这对我在他们的poms上声明是非法的。
相反,我创建了一个名为Global的独立项目,它将所有模块jar和test-jars列为其依赖项。 Global与所有模块具有相同的父级。我的想法是使用maven-ant-tasks我将能够获得所有模块jar和test-jar的类路径并从那里继续。 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(及其运行时依赖项)上声明的所有jar和test-jar的类路径。我曾尝试过(除其他事项外):
<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,但没有其他测试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取决于运行时间的B
Maven不允许声明这一点。我可以同情的原因是,maven需要按特定顺序完成多模块项目的构建周期(包括测试)。事实上,如果你为A的测试摆脱了对B的任何运行时依赖性,那么就没有必要声明它(这是一种很好的做法,无论如何都应该发生)。
你应该以maven的方式做事而不是诉诸蚂蚁任务
很公平,我可以看到maven-ant-tasks没有用于此用途。
在你的全局pom中,你声明同一个工件的两种类型(jar,test-jar)
一般来说这是一个问题吗?例如,模块A包含一些用于其测试的样本,我也想在模块B的测试中使用它们。 (根据maven最佳实践标准)声明B依赖于jar(编译范围)和测试jar(测试范围)是错误的吗?集成测试项目是否有理由依赖于模块以及用于其单元测试的相同模块的样本和资源?
tl; dr版本:我将尝试重新排列模块上声明的测试,并为集成测试创建单独的模块(假设我可以让20个开发人员玩球)。感谢您的回答,并让我承认失败并停止尝试让maven与项目合作,而不是让项目与maven一起工作:)。
答案 0 :(得分:2)
你试图以多种方式打破maven惯例。 1.你不应该有循环依赖,2。你应该以maven方式做事而不是诉诸于ant-tasks 3.在你的全局pom中,你声明同一个工件的两种类型(jar,test-jar)。 / p>
虽然起初这可能似乎无法解答您的问题,但您应该退后一步并重新考虑您的布局。集成测试需要所有依赖项,并且比单元测试要求更高。因此,不是试图将它们放入现有项目中,而是在同一组中创建一个单独的maven项目,它只会主持集成测试(在src / java / test下,main将为空)并且将具有所有其他的依赖项项目