【发布时间】:2016-02-16 19:33:01
【问题描述】:
考虑两个项目。
- mycompany-foo
- mycompany-foo-tests
在 mycompany-foo 中,我定义了一些我想在许多其他项目中使用的对象。为了便于代码复用,mycompany-foo-tests 定义了 hamcrest 匹配器,可以匹配 mycompany-foo 对象。
问题是 mycompany-foo-tests 将依赖于 mycompany-foo 以便我为其创建匹配器。然后 mycompany-foo 将依赖于 mycompany-foo-tests 以便我可以在 mycompany-foo 的测试中进行一些匹配。这会产生循环依赖。我想避免的事情。
我通过简单地将匹配器添加到 mycompany-foo、删除“tests”项目并将包含匹配器的测试 jar 作为“test-jar”导出来解决了这个问题。
一切都很顺利,直到我得知 Atlassian 的 clover 将它创建的工件安装到我的 m2 存储库 [1] 中。这会覆盖我的 test-jar 并导致下游项目在无法初始化我的匹配器的三叶草版本时失败。
我看到的建议是不要创建测试罐,而是回到我之前所做的事情。也就是说,有一个完整的独立项目供匹配器使用。有没有办法在不创建循环依赖的情况下做到这一点?
【问题讨论】:
-
如果
foo-tests是一个“库”,那么它不应该依赖于foo。就那么简单。如果需要,那么创建库是没有意义的。 -
为什么 mycompany-foo 应该依赖于 mycompany-foo-tests?
-
@LouisWasserman 我猜
mycompany-foo-tests包含mycompany-foo编写实际测试所需的测试工具。 -
@JaroslawPawlak,这完全正确。这就是为什么今天他们生活在同一个项目中,而我只是让 maven 创建了一个 test-jar 作为辅助工件。不幸的是,我链接到的丁香错误描述了一种行为,其中它用自己的覆盖测试罐。这就是可能将项目分开的动机。我显然不想这样做。
-
首先,听起来你的 clover 和你的构建管道有问题,而不是循环依赖。也许根本不值得使用三叶草?其次,我看不出为什么需要生成测试 jar。最后,我真的推荐使用 shazamcrest - 非常简单而强大的工具,您根本不需要编写任何自定义匹配器;)
标签: java maven hamcrest clover