如何使用 kotlin dsl 配置 Shadow 插件
How to configure Shadow plugin using kotlin dsl
我不知道如何在使用 kotlin DSL 构建的 gradle 中使用 shadow 插件。
所有文档都使用 groovy dsl.
这是build.gradle.kts的内容:
import groovy.lang.GroovyObject
import org.gradle.jvm.tasks.Jar
plugins {
// Apply the Kotlin JVM plugin to add support for Kotlin.
id("org.jetbrains.kotlin.jvm") version "1.4.10"
id("com.github.johnrengelman.shadow") version "6.1.0"
application
}
allprojects {
repositories {
// Use jcenter for resolving dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}
group = "com.example"
version = "1.0-SNAPSHOT"
}
dependencies {
// Align versions of all Kotlin components
implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
// Use the Kotlin JDK 8 standard library.
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}
application {
mainClass.set("com.example.MainKt")
}
tasks.withType<Jar> {
manifest {
attributes(
mapOf(
"ImplementationTitle" to project.name,
"Implementation-Version" to project.version)
)
}
}
这是src/main/kotlin/com/example/Main.kt
的内容
package com.example
fun main() {
println("Hello world")
}
但是当我尝试做 gradle build
时,我得到这个错误:
A problem was found with the configuration of task ':shadowJar' (type 'ShadowJar').
> No value has been specified for property 'mainClassName'.
我认为这很奇怪,因为我已经在 application
参数中输入了主应用程序 class。
我试过添加这个:
tasks.withType<ShadowJar>() {
mainClassName = "com.example.MainKt"
}
但是当我尝试使用此选项构建时,它会抱怨找不到 ShadowJar
类型。
Line 22: tasks.withType<ShadowJar>() {
^ Unresolved reference: ShadowJar
我做错了什么?
我建议在你的简单情况下配置默认的 shadowJar
和 jar
任务(不是所有 ShadowJar
和 Jar
类型的任务,因为你不是创建其他实例)。
tasks {
jar {
manifest {
attributes(
mapOf(
"Main-Class" to "com.example.MainKt", //will make your jar (produced by jar task) runnable
"ImplementationTitle" to project.name,
"Implementation-Version" to project.version)
)
}
}
shadowJar {
manifest.inheritFrom(jar.get().manifest) //will make your shadowJar (produced by jar task) runnable
}
}
application {
mainClassName = "com.example.MainKt" //will make run & runShadow tasks work. Have no idea why it can't take main class from jar/shadowJar manifests
}
问题是我试图将 mainClassName
添加到 ShadowJar
任务中,它应该被添加到 application
函数中。像这样:
application {
val name = "com.cognite.ingestionservice.MainKt"
mainClass.set(name)
// Required by ShadowJar.
mainClassName = name
}
mainClassName
属性 已弃用,但从版本 6.1.0.
开始,ShadowJar 仍然需要
mainClass.set()
在添加 mainClassName
时不是必需的,但它在 gradle 6.7 的文档中,所以我还是添加了它。
我不知道如何在使用 kotlin DSL 构建的 gradle 中使用 shadow 插件。 所有文档都使用 groovy dsl.
这是build.gradle.kts的内容:
import groovy.lang.GroovyObject
import org.gradle.jvm.tasks.Jar
plugins {
// Apply the Kotlin JVM plugin to add support for Kotlin.
id("org.jetbrains.kotlin.jvm") version "1.4.10"
id("com.github.johnrengelman.shadow") version "6.1.0"
application
}
allprojects {
repositories {
// Use jcenter for resolving dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}
group = "com.example"
version = "1.0-SNAPSHOT"
}
dependencies {
// Align versions of all Kotlin components
implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
// Use the Kotlin JDK 8 standard library.
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}
application {
mainClass.set("com.example.MainKt")
}
tasks.withType<Jar> {
manifest {
attributes(
mapOf(
"ImplementationTitle" to project.name,
"Implementation-Version" to project.version)
)
}
}
这是src/main/kotlin/com/example/Main.kt
package com.example
fun main() {
println("Hello world")
}
但是当我尝试做 gradle build
时,我得到这个错误:
A problem was found with the configuration of task ':shadowJar' (type 'ShadowJar').
> No value has been specified for property 'mainClassName'.
我认为这很奇怪,因为我已经在 application
参数中输入了主应用程序 class。
我试过添加这个:
tasks.withType<ShadowJar>() {
mainClassName = "com.example.MainKt"
}
但是当我尝试使用此选项构建时,它会抱怨找不到 ShadowJar
类型。
Line 22: tasks.withType<ShadowJar>() {
^ Unresolved reference: ShadowJar
我做错了什么?
我建议在你的简单情况下配置默认的 shadowJar
和 jar
任务(不是所有 ShadowJar
和 Jar
类型的任务,因为你不是创建其他实例)。
tasks {
jar {
manifest {
attributes(
mapOf(
"Main-Class" to "com.example.MainKt", //will make your jar (produced by jar task) runnable
"ImplementationTitle" to project.name,
"Implementation-Version" to project.version)
)
}
}
shadowJar {
manifest.inheritFrom(jar.get().manifest) //will make your shadowJar (produced by jar task) runnable
}
}
application {
mainClassName = "com.example.MainKt" //will make run & runShadow tasks work. Have no idea why it can't take main class from jar/shadowJar manifests
}
问题是我试图将 mainClassName
添加到 ShadowJar
任务中,它应该被添加到 application
函数中。像这样:
application {
val name = "com.cognite.ingestionservice.MainKt"
mainClass.set(name)
// Required by ShadowJar.
mainClassName = name
}
mainClassName
属性 已弃用,但从版本 6.1.0.
mainClass.set()
在添加 mainClassName
时不是必需的,但它在 gradle 6.7 的文档中,所以我还是添加了它。