如何在多模块项目中访问gradle中的测试jar

如何在多模块项目中访问gradle中的测试jar,gradle,gradle-kotlin-dsl,Gradle,Gradle Kotlin Dsl,我有一个项目。在其中一个模块中,我需要引用其他模块中的测试类。我尝试这样配置: // core project val testJar by tasks.registering(Jar::class) { archiveClassifier.set("tests") from(project.the<SourceSetContainer>()["test"].output) } val testArtifact by configurations.creating a

我有一个项目。在其中一个模块中,我需要引用其他模块中的测试类。我尝试这样配置:

// core project
val testJar by tasks.registering(Jar::class) {
    archiveClassifier.set("tests")
    from(project.the<SourceSetContainer>()["test"].output)
}
val testArtifact by configurations.creating
artifacts.add(testArtifact.name, testJar)
但这种配置不起作用。其他项目的编译失败,因为它没有从
core
project中看到所需的测试类。依赖性洞察:

./gradlew :service:dependencyInsight --dependency core --configuration testCompileClasspath
它提供了以下内容:

project :core
  variant "apiElements" [
    org.gradle.usage = java-api
  ]
  variant "testArtifact" [
    Requested attributes not found in the selected variant:
      org.gradle.usage = java-api
  ]

我正在努力理解如何使配置工作,以便能够编译
服务
项目的测试类。使用Kotlin DSL在Gradle 5.2.1上运行。

因此上述内容在命令行上运行,但在IDE中不起作用

以下是一个基于变量感知依赖关系管理的变体:

plugins {
    `java-library`
}

repositories {
    mavenCentral()
}

group = "org.test"
version = "1.0"

val testJar by tasks.registering(Jar::class) {
    archiveClassifier.set("tests")
    from(project.the<SourceSetContainer>()["test"].output)
}

// Create a configuration for runtime
val testRuntimeElements by configurations.creating {
    isCanBeConsumed = true
    isCanBeResolved = false
    attributes {
        attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class, Usage.JAVA_RUNTIME_JARS))
    }
    outgoing {
        // Indicate a different capability (defaults to group:name:version)
        capability("org.test:lib-test:$version")
    }
}

// Second configuration declaration, this is because of the API vs runtime difference Gradle makes and rules around valid multiple variant selection
val testApiElements by configurations.creating {
    isCanBeConsumed = true
    isCanBeResolved = false
    attributes {
        // API instead of runtime usage
        attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class, Usage.JAVA_API_JARS))
    }
    outgoing {
        // Same capability
        capability("org.test:lib-test:$version")
    }
}

artifacts.add(testRuntimeElements.name, testJar)
artifacts.add(testApiElements.name, testJar)
请注意,这需要Gradle 5.3.1。 IntelliJ 2019.1中项目的导入正确地连接了依赖项,测试代码可以在IDE中编译。

哪个IDE?
它在终端和IDE中都适用于我:我使用IntelliJ(2019.3)和Gradle(6.0.1,不是Kotlin DSL)

您能添加有关错误的信息吗?试着做同样的工作here@LouisJacomet嗯,结果证明它在格拉德尔有效。这是IDE的问题-它无法确定测试依赖项。
plugins {
    `java-library`
}

repositories {
    mavenCentral()
}

group = "org.test"
version = "1.0"

val testJar by tasks.registering(Jar::class) {
    archiveClassifier.set("tests")
    from(project.the<SourceSetContainer>()["test"].output)
}

// Create a configuration for runtime
val testRuntimeElements by configurations.creating {
    isCanBeConsumed = true
    isCanBeResolved = false
    attributes {
        attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class, Usage.JAVA_RUNTIME_JARS))
    }
    outgoing {
        // Indicate a different capability (defaults to group:name:version)
        capability("org.test:lib-test:$version")
    }
}

// Second configuration declaration, this is because of the API vs runtime difference Gradle makes and rules around valid multiple variant selection
val testApiElements by configurations.creating {
    isCanBeConsumed = true
    isCanBeResolved = false
    attributes {
        // API instead of runtime usage
        attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class, Usage.JAVA_API_JARS))
    }
    outgoing {
        // Same capability
        capability("org.test:lib-test:$version")
    }
}

artifacts.add(testRuntimeElements.name, testJar)
artifacts.add(testApiElements.name, testJar)
testImplementation(project(":lib")) {
    capabilities {
        // Indicate we want a variant with a specific capability
        requireCapability("org.test:lib-test")
    }
}