Gradle 如何在测试中使用渐变特性变量相关性?

Gradle 如何在测试中使用渐变特性变量相关性?,gradle,dependency-management,Gradle,Dependency Management,我正在将一个Maven库项目迁移到Gradle。原始项目还具有可选的依赖项。我使用了,但是将以前可选的依赖项移动到实现中会导致运行时依赖项而不是编译。所以我尝试了gradle,它在pom.xml中产生了正确的依赖关系。但是这样做的结果是测试编译失败,因为测试编译类路径上缺少特性变量的依赖项 这是我在build.gradle中的当前设置: apply plugin: 'java' apply plugin: 'java-library' apply plugin: 'maven-publish'

我正在将一个Maven库项目迁移到Gradle。原始项目还具有可选的依赖项。我使用了,但是将以前可选的依赖项移动到实现中会导致运行时依赖项而不是编译。所以我尝试了gradle,它在
pom.xml
中产生了正确的依赖关系。但是这样做的结果是测试编译失败,因为测试编译类路径上缺少特性变量的依赖项

这是我在
build.gradle
中的当前设置:

apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'maven-publish'

sourceCompatibility = 1.8

java {
  registerFeature('oSupport') {
    usingSourceSet(sourceSets.main)
  }
}

dependencies {
  api 'my.compile:dep-a:1.0.0'
  implementation 'my.runtime:dep-i:1.0.0'
  oSupportApi 'my.optional:dep-o:1.0.0'
}
假设有一个类
O
可从
my获得。可选:dep-O
。如果我在
src/main/java
中的任何类中导入
O
,它都能正常工作。此外,依赖项会直接导出到Maven(使用
gradle generatePomFileForMavenJavaPublication
,请参阅下面生成的
pom.xml
中的依赖项)。但是
src/test/java
中使用类
O
的任何测试都不会编译(
导入my.optional.O;
创建
错误:包my.optional不存在


我的
插件而不是buildin Gradle功能变体,但我更喜欢新的Gradle内置支持,以替代可选依赖项


PS:我使用Java 8和Gradle 5.6.2,当特性源集使用主源集时,这看起来像一个bug。你能报告一下吗

与此同时,这应该可以解决这个问题:

configurations {
    testCompileClasspath.extendsFrom(oSupportApi)
    testRuntimeClasspath.extendsFrom(oSupportApi)
    testRuntimeClasspath.extendsFrom(oSupportImplementation)
}

当要素源集使用主源集时,这看起来像一个bug。你能报告一下吗

与此同时,这应该可以解决这个问题:

configurations {
    testCompileClasspath.extendsFrom(oSupportApi)
    testRuntimeClasspath.extendsFrom(oSupportApi)
    testRuntimeClasspath.extendsFrom(oSupportImplementation)
}

真的很奇怪,我同意@melix这似乎是一个渐变

以下内容将修复它,但不需要,imho:

dependencies {
  api 'my.compile:dep-a:1.0.0'
  implementation 'my.runtime:dep-i:1.0.0'
  oSupportApi 'my.optional:dep-o:1.0.0'
  testImplementation(project(":${project.name}")) {
    capabilities {
      requireCapability("${project.group}:${project.name}-o-support")
    }
  }
}

对于这个只有一个功能依赖项的简化设置,可以用my.optional:dep-o:1.0.0'
替换
testImplementation'my.可选:dep-o:1.0.0'
,但是对于一般较大的依赖项列表,这种方法避免了重复依赖项,因为@melix的
扩展解决方案非常奇怪,我同意@melix这似乎是一个渐变

以下内容将修复它,但不需要,imho:

dependencies {
  api 'my.compile:dep-a:1.0.0'
  implementation 'my.runtime:dep-i:1.0.0'
  oSupportApi 'my.optional:dep-o:1.0.0'
  testImplementation(project(":${project.name}")) {
    capabilities {
      requireCapability("${project.group}:${project.name}-o-support")
    }
  }
}

对于这个只有一个功能依赖项的简化设置,可以用my.optional:dep-o:1.0.0'
替换为
testImplementation'my.可选:dep-o:1.0.0'
,但是对于一般较大的依赖项列表,这种方法避免了重复依赖项,因为@melix的
ExtendFrom
解决方案。

谢谢,至少它可以工作,我可以继续,创建了一个错误通知单谢谢,至少它可以工作,我可以继续,创建了一个错误通知单