java - 依赖同一个 Gradle 依赖项目的主代码和测试代码

标签 java gradle dependencies

我至少维护 2 个 Java Gradle 项目。假设我有一个名为A 的公共(public)项目和另一个依赖于A 的项目BA 在技术上对许多其他项目来说是通用的,但这不是我的问题的次要细节。无论如何,目前的情况是 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文件。

因此,我正在尝试寻求一种解决方案,其中此代码位于 Asrc/test/java 中,并部署在仅供测试的 JAR 文件中。有些帖子讨论了可能的解决方案,例如 this blog post或 SOF 帖子,例如 Multi-project test dependencies with gradleMulti-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 声明为 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-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/

相关文章:

configuration - SBT 配置 vs Ivy 模块配置

java - mapreduce hadoop 中的 reducer 数量

java - 如何仅获取特定文件的父目录名称

android - Android Studio Gradle sourceSets复制

android - 无法在 android 上运行最新的 react-native 应用程序

java - 使用 Spring Cache 的依赖

flutter - 可以同时使用 GetX 和 Get_it 吗?

java - 如何使用 Mockito 模拟父类(super class)中的 protected 变量

java - 移动应用程序的 Rest API 安全性

Android - 如何在 gradle build 时从 bitbucket 下载文本文件并将其添加到项目中