依赖于相同Gradle依赖项目的主代码和测试代码



我至少维护了2个Java Gradle项目。假设我有一个名为a的通用项目和另一个依赖于a项目A在技术上对许多其他项目来说是常见的,但这并不是我问题的一个小细节。无论如何,当前的情况是B在其build.gradle文件中将对a的依赖声明为一个简单的旧外部依赖,如下所示:

compile group:'com.example', name: 'A', version: '0.1'

我们在A中有特定于测试的代码,通过将其放在src/main/java中,我们与B共享这些代码。此代码必须保留在A而不是B中,因为还有其他依赖于A的项目使用此测试代码。我希望避免将代码放在这个目录中,因为它只用于测试,所以部署到生产中没有任何目的。此外,简单地将代码从A移动到B是不可能的,因为我所在组织中的其他项目都依赖于相同的代码,并且我希望避免代码重复。我宁愿将A中的测试代码移到src/test/java中,但这样它就不会发布到A的JAR文件中。

因此,我正试图寻求一种解决方案,其中该代码位于a中的src/test/java中,并部署在仅测试的JAR文件中。有些帖子讨论了可能的解决方案,比如这篇博客文章,或者SOF帖子,比如带gradle的多项目测试依赖关系和带gradle多项目测试依存关系然而,我不断遇到一个问题,原因是我没有维护多项目Gradle构建,而是维护两个完全独立的单项目Gradle生成,这一点无法改变。

我现在的处境是,我正在按照博客文章中建议的方式为A配置build.gradle,如下所示:

configurations {
    testOutput.extendsFrom testCompile
}
task jarTest (type: Jar, dependsOn: testClasses) {
    from sourceSets.test.output
    classifier = 'test'
}
artifacts {
    testOutput jarTest
}

然后在B的build.gradle中,我将A声明为compiletestCompile依赖项:

compile(group: 'com.example', name: 'A', version: '0.1')
testCompile(group: 'com.example', name: 'A', version: '0.1', configuration: 'testOutput')

这行不通。我没有得到B的测试类路径中可见的任何testCompile依赖项;gradle dependencies没有报告这些testCompile依赖项,我的IDE的代码搜索(IntelliJ)也没有识别这些依赖项。我抛出了一个万福玛利亚,甚至试图用classifier: 'test'代替configuration: 'testOutput',但没有成功。Gradle文档似乎也没有什么帮助,因为我的用例似乎并没有真正包含在它们的预期用例中。

不管怎样,我都可以实现我想要的Gradle用法,或者我一直在A的主JAR文件中导出只测试的代码?非常感谢所有的帮助。

我将只在测试期间使用的代码与只在测试过程中使用的库(例如JUnit或Mockito)完全相同:代码应该在一个单独的模块中,并有自己的名称。

因此,我建议您将A拆分为两个模块(相同的多项目构建):

  • A
  • A-测试支持

A的依赖关系必须更改为:

dependencies {
    testCompile project(':A-test-support')
}

B中,您必须使用以下依赖项:

dependencies {
    compile(group: 'com.example', name: 'A', version: '0.1')
    testCompile(group: 'com.example', name: 'A-test-support', version: '0.1')
}

最新更新