依赖于同一Gradle依赖项目的main和test代码

时间:2015-11-03 21:38:40

标签: java gradle dependencies

我至少维护了2个Java Gradle项目。假设我有一个名为 A 的公共项目,另一个项目 B 依赖于 A A 在技术上与许多其他项目相同,但这不是我的问题的细节。无论如何,目前的情况是 B 在其build.gradle文件中声明对A的依赖是一个普通的外部依赖,如下所示:

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

我们将 A 中的测试专用于 B ,并将其放在 src / main / java 中。此代码必须保留在 A 而不是 B ,因为还有其他项目取决于使用此测试代码的A。我想避免将代码放在这个目录中,因为它没有专门用于生产的目的,因为它只具有测试性质。此外,只是将代码从 A 移动到 B 是不可能的,因为我的组织中的其他项目依赖于相同的代码,我希望避免代码重复。我宁愿将 A 中的测试代码移动到 src / test / java ,但是它不会发布到 A 的JAR文件。

因此,我正在尝试寻找一个解决方案,其中此代码位于 A 中的 src / test / java 中,并部署在仅测试的JAR文件中。有些帖子讨论了可能的解决方案,例如this blog post或SOF帖子,例如Multi-project test dependencies with gradleMulti-project test dependencies with gradle HOWEVER ,我连续遇到一个问题,这个问题是由于我没有维护多项目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个依赖项;这些testCompile依赖项未由gradle dependencies报告,也未被我的IDE代码搜索(IntelliJ)识别。我扔了一个Hail Mary,甚至试图用configuration: 'testOutput'替换classifier: 'test',但无济于事。 Gradle文档似乎也没有帮助,因为我的用例似乎并未真正涵盖在他们的预期用例中。

任何方式我都可以实现我想要的Gradle使用,或者我是否坚持在 A 的主要JAR文件中导出仅测试代码?所有人都非常感激。

1 个答案:

答案 0 :(得分:0)

我会将测试期间仅需要的代码与仅在测试期间使用的库完全相同(例如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')
}