如何使用 gradle 脚本 Kotlin 构建文件构建可运行的 ShadowJar?
How to build a runnable ShadowJar with a gradle script Kotlin build file?
最简单的 Kotlin hello world for gradle script Kotlin:
thufir@dur:~/github/gradleScriptKotlin$
thufir@dur:~/github/gradleScriptKotlin$ gradle clean shadowJar;java -jar build/libs/gradleScriptKotlin.jar
> Task :compileKotlin
Using Kotlin incremental compilation
> Task :shadowJar
A problem was found with the configuration of task ':shadowJar'. Registering invalid inputs and outputs via TaskInputs and TaskOutputs methods has been deprecated and is scheduled to be removed in Gradle 5.0.
- No value has been specified for property 'mainClassName'.
The SimpleWorkResult type has been deprecated and is scheduled to be removed in Gradle 5.0. Please use WorkResults.didWork() instead.
BUILD SUCCESSFUL in 1s
4 actionable tasks: 4 executed
Hello gradle script Kotlin world!
thufir@dur:~/github/gradleScriptKotlin$
为了简洁起见,请参考 project itself,它实际上只包含构建文件和一个 kotlin 脚本。
如何使用 gradle 脚本 Kotlin 构建文件构建可运行的 ShadowJar?
你是说 fatjar 吗?
如果是这样,您可以使用 shadow gradle 插件:
id 'com.github.johnrengelman.shadow' version '2.0.2'
如果你想让 jar 可执行,你还需要添加 Main-class
到清单(下面是文件 Applicaion.kt
中的主要方法示例,包 test
):
jar {
manifest {
attributes 'Main-Class': 'test.ApplicationKt'
}
}
有了这个,您可以 运行 jar
使用命令:java -jar <your jar>
下面我有一个简单的例子。文件 build.gradle
:
plugins {
id 'com.github.johnrengelman.shadow' version '2.0.2'
id "org.jetbrains.kotlin.jvm" version "1.2.21"
}
repositories {
jcenter()
}
jar {
manifest {
attributes 'Main-Class': 'test.ApplicationKt'
}
}
dependencies {
compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
compile("org.simpleframework:simple-xml:2.5")
}
文件test.Application.kt
:
package test
import org.simpleframework.xml.Element
import org.simpleframework.xml.ElementList
import org.simpleframework.xml.Root
import org.simpleframework.xml.core.Persister
private val testXml = """
<feed>
<entry>
<id> someid </id>
<published> somedate </published>
</entry>
<entry>
<id> someid2 </id>
<published> somedate2 </published>
</entry>
</feed>
""".trimIndent()
@Root(name = "feed", strict = false)
data class Feed(
@field:ElementList(name = "entry", inline = true)
var entriesList: List<Entry>? = null
)
@Root(name = "entry", strict = true)
data class Entry(
@field:Element(name = "id")
var id: String? = null,
@field:Element(name = "published")
var published: String? = null
)
fun main(args: Array<String>) {
println(testXml)
val serializer = Persister()
val example = serializer.read(Feed::class.java, testXml)
println(example)
}
运行 命令:gradle shadowJar
然后尝试 运行 罐子:java -jar build/libs/shadow_test-all.jar
更新2018-02-17
build.gradle.kts
文件版本:
import org.jetbrains.kotlin.gradle.dsl.Coroutines
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.jetbrains.kotlin.jvm") version "1.2.21"
id("com.github.johnrengelman.shadow") version "2.0.2"
}
repositories {
jcenter()
}
tasks.withType<Jar> {
manifest {
attributes(mapOf(
"Main-Class" to "test.ApplicationKt"
))
}
}
dependencies {
compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
compile("org.simpleframework:simple-xml:2.5")
}
以上答案使用的是非常旧的版本,对于较新的版本:
添加插件:
id("com.github.johnrengelman.shadow") version "6.1.0"
指定主要class:
application {
mainClassName = "com.pkg.MainClassKt"
}
最后,指定 shadowJar 任务:
tasks {
named<ShadowJar>("shadowJar") {
archiveBaseName.set("jarFileNmae")
}
}
最简单的 Kotlin hello world for gradle script Kotlin:
thufir@dur:~/github/gradleScriptKotlin$
thufir@dur:~/github/gradleScriptKotlin$ gradle clean shadowJar;java -jar build/libs/gradleScriptKotlin.jar
> Task :compileKotlin
Using Kotlin incremental compilation
> Task :shadowJar
A problem was found with the configuration of task ':shadowJar'. Registering invalid inputs and outputs via TaskInputs and TaskOutputs methods has been deprecated and is scheduled to be removed in Gradle 5.0.
- No value has been specified for property 'mainClassName'.
The SimpleWorkResult type has been deprecated and is scheduled to be removed in Gradle 5.0. Please use WorkResults.didWork() instead.
BUILD SUCCESSFUL in 1s
4 actionable tasks: 4 executed
Hello gradle script Kotlin world!
thufir@dur:~/github/gradleScriptKotlin$
为了简洁起见,请参考 project itself,它实际上只包含构建文件和一个 kotlin 脚本。
如何使用 gradle 脚本 Kotlin 构建文件构建可运行的 ShadowJar?
你是说 fatjar 吗? 如果是这样,您可以使用 shadow gradle 插件:
id 'com.github.johnrengelman.shadow' version '2.0.2'
如果你想让 jar 可执行,你还需要添加 Main-class
到清单(下面是文件 Applicaion.kt
中的主要方法示例,包 test
):
jar {
manifest {
attributes 'Main-Class': 'test.ApplicationKt'
}
}
有了这个,您可以 运行 jar
使用命令:java -jar <your jar>
下面我有一个简单的例子。文件 build.gradle
:
plugins {
id 'com.github.johnrengelman.shadow' version '2.0.2'
id "org.jetbrains.kotlin.jvm" version "1.2.21"
}
repositories {
jcenter()
}
jar {
manifest {
attributes 'Main-Class': 'test.ApplicationKt'
}
}
dependencies {
compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
compile("org.simpleframework:simple-xml:2.5")
}
文件test.Application.kt
:
package test
import org.simpleframework.xml.Element
import org.simpleframework.xml.ElementList
import org.simpleframework.xml.Root
import org.simpleframework.xml.core.Persister
private val testXml = """
<feed>
<entry>
<id> someid </id>
<published> somedate </published>
</entry>
<entry>
<id> someid2 </id>
<published> somedate2 </published>
</entry>
</feed>
""".trimIndent()
@Root(name = "feed", strict = false)
data class Feed(
@field:ElementList(name = "entry", inline = true)
var entriesList: List<Entry>? = null
)
@Root(name = "entry", strict = true)
data class Entry(
@field:Element(name = "id")
var id: String? = null,
@field:Element(name = "published")
var published: String? = null
)
fun main(args: Array<String>) {
println(testXml)
val serializer = Persister()
val example = serializer.read(Feed::class.java, testXml)
println(example)
}
运行 命令:gradle shadowJar
然后尝试 运行 罐子:java -jar build/libs/shadow_test-all.jar
更新2018-02-17
build.gradle.kts
文件版本:
import org.jetbrains.kotlin.gradle.dsl.Coroutines
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.jetbrains.kotlin.jvm") version "1.2.21"
id("com.github.johnrengelman.shadow") version "2.0.2"
}
repositories {
jcenter()
}
tasks.withType<Jar> {
manifest {
attributes(mapOf(
"Main-Class" to "test.ApplicationKt"
))
}
}
dependencies {
compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
compile("org.simpleframework:simple-xml:2.5")
}
以上答案使用的是非常旧的版本,对于较新的版本:
添加插件:
id("com.github.johnrengelman.shadow") version "6.1.0"
指定主要class:
application {
mainClassName = "com.pkg.MainClassKt"
}
最后,指定 shadowJar 任务:
tasks {
named<ShadowJar>("shadowJar") {
archiveBaseName.set("jarFileNmae")
}
}