首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在测试中使用gradle特性变量依赖?

如何在测试中使用gradle特性变量依赖?
EN

Stack Overflow用户
提问于 2019-09-18 16:26:45
回答 2查看 663关注 0票数 1

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

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

代码语言:javascript
运行
复制
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'
}

让我们假设有一个my.optional:dep-o提供的类O。如果我在src/main/java中的任何类中导入O,它都能完美地工作。依赖关系也会直接导出到Maven.(使用gradle generatePomFileForMavenJavaPublication,请参阅下面生成的pom.xml中的依赖关系)。但是在src/test/java中使用类O的任何测试都不会编译(import my.optional.O;会创建error: package my.optional does not exist)

代码语言:javascript
运行
复制
<dependencies>
    <dependency>
      <groupId>my.compile</groupId>
      <artifactId>dep-a</artifactId>
      <version>1.0.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>my.rintime</groupId>
      <artifactId>dep-r</artifactId>
      <version>1.0.0</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>my.optional</groupId>
      <artifactId>dep-0</artifactId>
      <version>1.0.0</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
</dependencies>

如何解决这个问题?我知道我本可以使用nebula.optional-base插件而不是内置Gradle特性变体,但我更喜欢新的gradle内置支持可选依赖项。

PS:我使用Java 8和Gradle 5.6.2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-18 20:49:16

当要素源集使用主源集时,这看起来像是一个错误。你能在https://github.com/gradle/gradle/issues上报道吗?

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

代码语言:javascript
运行
复制
configurations {
    testCompileClasspath.extendsFrom(oSupportApi)
    testRuntimeClasspath.extendsFrom(oSupportApi)
    testRuntimeClasspath.extendsFrom(oSupportImplementation)
}
票数 3
EN

Stack Overflow用户

发布于 2019-09-18 23:45:54

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

下面的代码将会修复它,但不应该是必需的,imho:

代码语言:javascript
运行
复制
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")
    }
  }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57988257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档