我至少维护 2 个 Java Gradle 项目。假设我有一个名为A 的公共(public)项目和另一个依赖于A 的项目B。 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 文件中。有些帖子讨论了可能的解决方案,例如 this blog post或 SOF 帖子,例如 Multi-project test dependencies with gradle和 Multi-project test dependencies with 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 声明为 compile
和 testCompile
依赖项:
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-test-support
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')
}
关于java - 依赖同一个 Gradle 依赖项目的主代码和测试代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33509561/