首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用gradle脚本Kotlin构建文件构建可运行的ShadowJar?

如何使用gradle脚本Kotlin构建文件构建可运行的ShadowJar?
EN

Stack Overflow用户
提问于 2018-02-07 10:23:29
回答 2查看 10.2K关注 0票数 13

最简单的Kotlin gradle脚本Kotlin的hello

代码语言:javascript
复制
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$ 

为了简洁起见,请参考项目本身,它只包含构建文件和kotlin脚本。

如何使用gradle脚本Kotlin构建文件构建可运行的ShadowJar?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-16 12:23:46

你是说法特加吗?如果是这样,您可以使用影子gradle插件:

代码语言:javascript
复制
id 'com.github.johnrengelman.shadow' version '2.0.2'

如果要使jar可执行,还需要将Main-class添加到清单中(下面是Applicaion.kt文件中包含包test的主要方法的示例):

代码语言:javascript
复制
jar {
    manifest {
        attributes 'Main-Class': 'test.ApplicationKt'
    }
}

使用此命令,您可以使用命令:jarjava -jar <your jar>运行java -jar <your jar>

下面我有一个简单的例子。文件build.gradle

代码语言:javascript
复制
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

代码语言:javascript
复制
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

在尝试运行jar之后:java -jar build/libs/shadow_test-all.jar

更新2018-02-17

文件的build.gradle.kts版本:

代码语言:javascript
复制
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")
}
票数 17
EN

Stack Overflow用户

发布于 2022-03-26 21:06:43

上面的答案使用了一个非常旧的版本,用于更新的版本:

添加插件:

代码语言:javascript
复制
id("com.github.johnrengelman.shadow") version "6.1.0"

指定主类:

代码语言:javascript
复制
application {
    mainClassName = "com.pkg.MainClassKt"
}

最后,指定shadowJar任务:

代码语言:javascript
复制
tasks {
    named<ShadowJar>("shadowJar") {
        archiveBaseName.set("jarFileNmae")
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48661330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档