当前位置: 首页 > 知识库问答 >
问题:

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

高胜
2023-03-14

gradle脚本最简单的Kotlin hello world for:

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?

共有2个答案

楚昀
2023-03-14

上面的回答用的是很老的版本,对于较新的版本:

添加插件:

id("com.github.johnrengelman.shadow") version "6.1.0"

指定主类:

application {
    mainClassName = "com.pkg.MainClassKt"
}

最后,指定shadJar任务:

tasks {
    named<ShadowJar>("shadowJar") {
        archiveBaseName.set("jarFileNmae")
    }
}
刘翔宇
2023-03-14

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

id 'com.github.johnrengelman.shadow' version '2.0.2'

如果您想使jar可执行,您还需要添加Main-class来清单(下面是文件Applicaion.kt中带有包test的main方法的示例):

jar {
    manifest {
        attributes 'Main-Class': 'test.ApplicationKt'
    }
}

有了它,您可以使用命令运行<code>jar<code>java-jar

下面我有包括简单的例子。文件< code>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)
}

Run 命令: gradle shadowJar

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

更新2018-02-17

文件的< code>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")
}
 类似资料:
  • 我想在gradle构建脚本中从groovy迁移到kotlin dsl。我在项目中有2个脚本:build。gradle和publish maven。第一个连接的gradle。 对于groovy,我应用脚本如下: 对于kotlin,我发现相同的代码如下所示: 但是publish-maven.gradle.kts没有附加到build.gradle.kts.在IDE脚本的顶部经常挂着警告: 代码洞察不可用

  • 主要内容:Gradle如何使用Groovy,Groovy的JDK方法,以下是纠正/补充内容:Gradle构建脚本文件用来处理两件事情:一个是项目和另一个的任务。每个生成表示一个或多个项目。一个项目表示一个JAR库或Web应用程序,也可能表示由其他项目产生的JAR文件组装的ZIP。简单地说,一个项目是由不同的任务组成。一个任务是指构建执行的一块工作。任务可能是编译一些类,创建一个,产生的或发布一些归档文件库。 注:Gradle使用Groovy语言编写脚本。 Gradle提供了一个域特定语言

  • 我知道这是一个专门用于Gradle构建脚本的DSL,但是我在哪里可以找到它,如何解析/使用它呢? 谢谢!

  • 主要内容:执行多个任务,排除任务,发生故障时继续构建,选择执行哪些构建,获取构建信息Gradle提供了一个命令行来执行构建脚本。 它可以一次执行多个任务。在这里将介绍如何使用不同的选项来执行多个任务。 执行多个任务 可以从单个构建文件执行多个任务。使用命令处理构建文件。此命令将按列出的顺序编译每个任务,并使用不同的选项执行每个任务以及依赖关系。 示例 - 假设有四个任务 - ,,和。和取决于和。 看看下面的图表。 在上面的四个任务是相互依赖的,用一个箭头符号表示。 看看下面的代码

  • Gradle 是以 Groovy 语言为基础, 基于DSL (领域特定语言) 语法的自动化构建工具,但是它增加了一些额外的特性,这使得Gradle更加的容易去阐释构建. 一个构建脚本能够包含任何Groovy语言的元素 ( Any language element except for statement labels ), 每个构建脚本都使用UTF-8编码.

  • 项目可以通过添加向构建脚本中加入插件的类路径然后在应用插件,添加作为外部JAR文件的二进制插件.外部jar可以使用buildscrip{}块添加到构建脚本类路径就像Section 62.6, “External dependencies for the build script”中描述的一样. Example 21.4. Applying a plugin with the buildscript