Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用maven ant任务获取多模块项目集成测试的类路径_Java_Maven_Ant_Continuous Integration_Maven Ant Tasks - Fatal编程技术网

Java 使用maven ant任务获取多模块项目集成测试的类路径

Java 使用maven ant任务获取多模块项目集成测试的类路径,java,maven,ant,continuous-integration,maven-ant-tasks,Java,Maven,Ant,Continuous Integration,Maven Ant Tasks,我有一个用maven构建的多模块项目。我需要每天运行项目的集成测试。在标准maven构建周期中不可能做到这一点,因为在运行时,模块中定义的集成测试具有循环依赖关系,这对于我来说在它们的POM上声明是非法的 相反,我创建了一个名为Global的单独项目,该项目将所有模块jar和测试jar列为其依赖项。全局模块与所有模块具有相同的父模块。其思想是,使用maven ant任务,我将能够获得所有模块JAR和测试JAR的类路径,并从那里继续。Global的pom.xml依赖项部分如下所示: <dep

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

相反,我创建了一个名为Global的单独项目,该项目将所有模块jar和测试jar列为其依赖项。全局模块与所有模块具有相同的父模块。其思想是,使用maven ant任务,我将能够获得所有模块JAR和测试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


mygroup
A.
${project.version}
mygroup
A.
${project.version}
试验罐
测试
mygroup
B
${project.version}
mygroup
B
${project.version}
试验罐
测试
等

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


[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的任何运行时依赖性(这是一种很好的实践,无论如何都应该发生),那么就没有必要声明它

你应该以专业的方式做事,而不是求助于ant任务

公平地说,我可以看出maven ant任务是如何不用于此用途的

在全局pom中,您正在为同一工件(jar、测试jar)声明双重类型

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


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

你试图在许多方面打破maven的惯例。1.你不应该有循环依赖,2。你应该以专业的方式做事,而不是求助于ant任务3。在全局pom中,您为同一工件(jar、测试jar)声明了双重类型


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

。问题是,这是一个3年的项目,我只是“专业化”,所以没有太多的回旋余地。感谢您抽出时间回答此问题。已接受。我在问题的末尾做了一些修改。如果你能快速看一下,我将不胜感激。再次感谢。[1]运行时依赖关系“模块A依赖于运行时上的B”是由容器实现的松散依赖关系,该容器将“自动检测”接口的实现(或者在spring中读取XML)。编译时依赖关系才是重要的,maven不会接受循环。即使你欺骗了maven,它也很脆弱,很难维护,而且是非正统的。[2] 酷。[3] 测试的公共部分最好移动到单独的模块中,该模块将作为测试依赖项包含在所有其他项目中。
<dependencies pathId="cp3" type="test-jar" usescope="test">
    <pom file="${basedir}/pom.xml">
        <profile id="DEV" />
    </pom>
</dependencies>