在Gradle的编译类路径中包含运行时类路径的正确方法是什么?

0s0u357o  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(166)

我有以下Gradle项目结构:

project-root/
├── adapters/
│   ├── adapter1/
│   │   ├── main
│   │   └── test
│   ├── adapter2/
│   │   ├── main
│   │   └── test
│   └── adapter3/
│       ├── main
│       └── test
└── app-spring-boot/
    ├── main
    ├── test
    └── integrationTest

app-spring-boot模块中,适配器仅作为运行时依赖项包括在内:

// project-root/app-spring-boot/build.gradle.kts
dependencies {
    runtimeOnly(project(":adapters:adapter1")
    runtimeOnly(project(":adapters:adapter2")
    runtimeOnly(project(":adapters:adapter3")
}

integrationTest源代码集的app-spring-boot模块中,我希望能够在编译时访问所有依赖项,不仅可以直接从app-spring-boot访问,还可以从所有包含的:adapters项目访问。
我使用了以下配置:

// project-root/app-spring-boot/build.gradle.kts
plugins {
    `jvm-test-suite`
}

testing {
    suites {
        val test by getting(JvmTestSuite::class)

        val integrationTest by registering(JvmTestSuite::class) {
            useJUnitJupiter()
            dependencies {
                implementation(project())
            }
            sources {
                compileClasspath += sourceSets.main.get().runtimeClasspath
            }
        }
    }
}

compileClasspath += sourceSets.main.get().runtimeClasspath就能做到这一点,而且所包含的runtimeOnly项目中的所有依赖项都可以在编译时访问,但我想知道Gradle的正确惯用方法是什么,尤其是在我看到@chalimartinescomment之后。

sqyvllje

sqyvllje1#

我同意您找到的评论,说添加到编译类路径不是正确的方法,因为您最终会得到重复的依赖项。
当应用测试套件插件时,它将创建一组配置,这些配置类似于来自maintest源集的配置,并以测试套件的名称作为前缀。因为您的测试套件名为integrationTest,所以“实现”配置名为integrationTestImplementation
有了这个,你可以通过测试套件的这个实现配置扩展主源代码集中的常规runtimeClasspath配置,将运行时依赖项添加到编译类路径中。

testing {
    // ...
}

configurations["integrationTestImplementation"].extendsFrom(configurations["runtimeClasspath"])

相关问题