如何使用java插件与buildSrc代码



我正在尝试移动"超级)jar"我使用的代码来自我的根build.gradle.kts将文件修改为buildSrc目录下的文件。为此,我创建了一个文件buildSrc/src/main/kotlin/executableJar.kt:

import org.gradle.api.Project
import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.Jar
import org.gradle.kotlin.dsl.register
fun Project.makeExecutableJar (name: String, main: String?, sset: SourceSet) : TaskProvider<Jar>
{
return tasks.register<Jar>(name) {
dependsOn(configurations.runtimeClasspath)
archiveFileName.set("$name.jar")
main?.let { manifest.attributes["Main-Class"] = it }
duplicatesStrategy = DuplicatesStrategy.INCLUDE
sset.allSource.forEach { println("==> Source: ${it.absolutePath}") }
from(sset.output)
from(sset.runtimeClasspath.filter {
println("==> Include: ${it.name}")
it.name.endsWith(".jar")}.map { zipTree(it) }
)
}
}

但是,我得到一个"未解析的引用"。在intJ中configurations.runtimeClasspath,这需要java插件。因此,我在buildSrc/build.gradle.kts中添加了几行,现在看起来像这样:

plugins {
`kotlin-dsl`
java
}
repositories {
mavenCentral()
gradlePluginPortal()
}

但这并不能解决问题。我如何访问java插件功能的东西在buildSrc?我最好的猜测是,我需要为它包括一个显式的dependency { implementation(...) },但是,在搜索maven和gradle插件门户后,我无法确定url/ID字符串

configurations.runtimeClasspath是一个生成的Gradle Kotlin DSL访问器,这些只在*.gradle.kts文件中可用。

您必须通过名称访问配置,使用ConfigurationContainer.getByName()

方便的是,JavaPlugin提供了runtimeClasspath配置的名称,因此它可以直接导入和使用(而不是使用'magic'字符串)。

// import JavaPlugin
import org.gradle.api.plugins.JavaPlugin
// (existing imports)
// import ...
fun Project.makeExecutableJar (name: String, main: String?, sset: SourceSet) : TaskProvider<Jar> {
// access the runtimeClasspath configuration
val runtimeClasspathConfiguration = configurations.named(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME)

return tasks.register<Jar>(name) {
dependsOn(runtimeClasspathConfiguration )
// ...
}
}

最新更新