我的设立是这样的。 我有项目A
,和一个测试项目取决于A
:
A <- A_t
我也有这取决于其他项目A
(和他们的测试):
A <- B <- B_t
为了简化某些测试中,我介绍一个新的图书馆帮助我们进行测试的东西的基础上A
:
A <- Atesthelper
所以A_t
(和B_t
)将取决于本次测试的帮手,就像这样:
A <- A_t
^ |
| v
Atesthelper
然而,当我创建Maven项目(pom.xml的)似乎平常的事情是捆绑两个项目,并在同一个pom.xml中该项目的测试。 我创建了一个新的pom.xml Atesthelper
所以,现在就变成:
(A <- A_t)
^ |
| v
Atesthelper
这是一个循环依赖。 是否有可能在pom.xml以某种方式指定Atesthelper
仅仅是测试版本,目标的依赖,而不是A
本身模块?
所以构建顺序应该是:A,Atesthelper,A_T。 即A和A_T这是在同一个POM中指定,不应该建立在同一时间。
提前致谢。
你需要解决的问题是从Atesthelper到A的依赖,那么一切将正常工作: 一要看Atesthelper,B依赖于Atesthelper和A和B将同时包含源和测试。 Atesthelper将包含在A和B两个范围测试 。 这就是你的目标状态。
你怎么到那的? 你需要提取Atesthelper取决于到一个单独的项目的项目。 通常,这些接口或其他常用功能,这本来也应该放入一个单独的项目-我们称之为ACommon。 所以,你的目标布局应该是这样的:
ACommon <- Atesthelper
^ ^
| /
A (and also B)
什么样的功能Atesthelper取决于阿 ? 你可以把它移到一个单独的项目(ACommon)?
如果我理解你的权利,你的主要目标是重复使用的测试类。 A_T和Atesthelper不是Maven项目,他们的测试。
让Maven来创建你的src / test / java下一个罐子。 见http://maven.apache.org/guides/mini/guide-attached-tests.html
A的构建后,您将获得a.jar文件和A-tests.jar。 A-tests.jar将包括Atesthelper和A_T。
B与A-tests.jar设置依赖性( <type>test-jar</type>)
你没贴你的POM,我不知道如果我理解正确的话,但我会尽力帮助你怎样,我得到了它。 这是通常应该解决这样很常见的情况:
你Atesthelper
神器(可能是jar
包装),支持的测试,应该在所有的测试相关的东西src/main
目录(所以在类src/main/java
,在资源src/main/resources
等),不src/test
! 其所有的依赖关系,因此A
,但也很喜欢的JUnit,EasyMock的(所有的东西,测试支持类需要)的东西,你用声明compile
范围,这是默认的课程之一。 不要用test
此范围内! 最后,在A
和B
工件,声明Atesthelper
作为依赖性test
范围。
对我多年的这种解决方案的伟大工程。 它是干净的,有关相关straigt(他们在对比传递<type>test-jar</type>
为基础的解决方案,如果你知道我的意思)。 总之,只要使用它。 你会很高兴;)。
要解决这个问题,最彻底的方法是保持分离项目。 有喜欢的Maven鼓励你把类和测试类到一个单一的项目框架。 Eclipse插件项目例如有独立的测试项目。 制作A_t
的一个子项目A
听起来像最好的解决办法,因为你可以重用你想在测试项目中的任何依赖关系,不必担心影响A
。
这种情形会更频繁出现,你可能不希望与测试依赖打扰你的项目设计。 这些测试应该是独立的,不影响你的类的设计。
文章来源: Resolving Maven circular dependencies between test, testhelper, and project-under-test