【问题标题】:using Kotlin with Gradle将 Kotlin 与 Gradle 一起使用
【发布时间】:2017-05-31 16:46:34
【问题描述】:

我是KotlinGradle 的新手,并尝试遵循these 的步骤,所以我得到了以下2 个文件:

在运行gradle init 之后,我将build.gradle 更改为:

// set up the kotlin-gradle plugin
buildscript {
    ext.kotlin_version = '1.1.2-2'

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

// apply the kotlin-gradle plugin
apply plugin: "kotlin"
apply plugin: 'application'

mainClassName = "hello.main"

// add kotlin-stdlib dependencies.
repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

Hello.kt:

package hello   

fun main(args: Array<String>) {   
   println("Hello World!")        
}

然后我运行gradle build 并得到build\classes\main\hello\HelloKt.class

我的问题是:为什么生成的文件是.class 而不是.jar 以及如何获取.jar 文件以及如何运行它,我尝试使用kotlin -classpath HelloKt.class main 运行生成的文件,但出现错误@987654335 @

【问题讨论】:

    标签: java gradle kotlin


    【解决方案1】:

    类是 Kotlin 编译器的直接输出,之后应该由 Gradle 打包成 JAR。要构建 JAR,您可以运行 jar 任务,就像在 Java 项目中一样:

    gradle jar
    

    由于任务依赖关系,该任务通常也在gradle build期间运行。

    这会将 Kotlin 类打包到一个 JAR 存档中(如果您有一个多语言项目,则与其他 JVM 类一起),通常位于 build/libs/<i>yourProjectName</i>.jar

    关于运行JAR,详细解释见此问答:(link)

    【讨论】:

    • 我没有 JAVA 经验,我运行 gradle jar 但我发现这个文件只有 build/libs/Kotlin.jar
    • 因此,这个单一的 JAR 档案实际上应该包含编译器从您的源代码生成的所有 Kotlin 类(包括 HelloKt.class)。通常,在 Gradle 构建中,项目的 Kotlin 类会合并到一个或多个 JAR 档案中——这就是您在 build/libs/ 中得到的。
    • 添加了另一个关于运行 JAR 的问答的链接。
    【解决方案2】:

    感谢@hotkey 的回答,它帮助我走上了正确的道路。

    首先在主类声明中有一个错误,因为它应该遵循新的方法,即如下格式:

    mainClassName = '[your_namespace].[your_arctifact]Kt'
    

    命名空间 = 包名

    artifact = 文件名

    所以,考虑上面示例中给出的名称,其中文件名是:Hello.kt,命名空间是hello,那么:

    mainClassName = `[hello].[Hello]Kt`
    

    使用前面的方法,包含:

    apply plugin: 'application'
    mainClassName = 'hello.HelloKt'
    

    生成的 .jar 文件不包括 kotlin 运行时,因此执行它的唯一方法是:

    d:/App/build/libs/kotlin -cp App.jar hello.HelloKt
    

    但是为了生成一个可以自我执行的自包含jar,并且包含kotlin runtime,那么build.gradle应该写成:

    // set up the kotlin-gradle plugin
    buildscript {
        ext.kotlin_version = '1.1.2-2'
    
        repositories {
            mavenCentral()
        }
    
        dependencies {
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }
    
    // apply the kotlin-gradle plugin
    apply plugin: "kotlin"
    
    
    // add kotlin-stdlib dependencies.
    repositories {
        mavenCentral()
    }
    
    dependencies {
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    }
    
    jar {
        manifest {
            //Define mainClassName as: '[your_namespace].[your_arctifact]Kt'
            attributes 'Main-Class': 'hello.HelloKt'
        }
    
        // NEW LINE HERE !!!
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    }
    

    后跟gradle build,会在build/libs文件夹下生成[your_working_folder].jar文件,假设工作文件夹名称为app,则生成文件app.jar。

    要运行此文件,可以使用以下 2 个命令之一:

    D:\App\build\libs\java -jar App.jar
    

    D:\App\build\libs\kotlin App.jar hello.HelloKt
    

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多