Kotlin Gradle找不到或加载主类

时间:2018-04-03 06:01:05

标签: spring-boot gradle kotlin spring-boot-gradle-plugin

我尝试复制Spring Boot Kotlin示例项目https://github.com/JetBrains/kotlin-examples/tree/master/tutorials/spring-boot-restful。添加了一些更多依赖项,当尝试构建可执行jar并运行时,它会显示“找不到或加载主类”。

Gradle构建脚本: -

buildscript {
    ext.kotlin_version = '1.1.3' // Required for Kotlin integration
    ext.spring_boot_version = '1.5.4.RELEASE'
    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // Required for Kotlin integration
        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin
        classpath "org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version"
    }
}

/*plugins {
    id 'org.springframework.boot' version '2.0.0.RELEASE'
}*/

apply plugin: 'kotlin' // Required for Kotlin integration
apply plugin: "kotlin-spring" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin
apply plugin: 'org.springframework.boot'

jar {
    baseName = 'gs-rest-service'
    version = '0.1.0'
    from {
        (configurations.runtime).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    manifest {
        attributes 'Main-Class': 'org.jetbrains.kotlin.demo.Applicationkt'
    }


}

sourceSets {
    main.java.srcDirs += 'src/main/kotlin/'
    test.java.srcDirs += 'src/test/kotlin/'
}

repositories {
    jcenter()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // Required for Kotlin integration
    compile("org.springframework.boot:spring-boot-starter-web")

    compile group: 'org.apache.camel', name: 'camel-quartz2', version: '2.20.2'
    compile group: 'org.apache.camel', name: 'camel-http4', version: '2.20.2'
    compile group: 'org.apache.camel', name: 'camel-docker', version: '2.20.2'
    compile group: 'org.apache.camel', name: 'camel-aws', version: '2.20.2'

    testCompile('org.springframework.boot:spring-boot-starter-test')
}

4 个答案:

答案 0 :(得分:3)

Applicationkt更改为ApplicationKt即可,BTW您可以将Kotlin版本升级为1.2.31

Applicationkt我的意思是这一行:

attributes 'Main-Class': 'org.jetbrains.kotlin.demo.Applicationkt'

答案 1 :(得分:1)

将build.gradle更新为

jar {
    manifest {
        attributes 'Main-Class': 'org.jetbrains.kotlin.demo.ApplicationKt'
    }
    from { 
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } 
    }
}

在ApplicationKt中使用大写字母K.

这是必需的,因为Kotlin编译为Java字节码的方式。 Kotlin中的fun main()函数没有附加到任何类,但Java总是需要一个类,并且不支持无类函数。

Kotlin编译器必须创建一个Java类。因为您已经定义了一个类Application,所以它为您的Kotlin文件Kt中的函数创建了一个带有后缀org/jetbrains/kotlin/demo/Application.kt的类。您必须设置此类以便JVM可以找到它。

顺便说一下,一个Jar文件只是一个Zip文件,如果ApplicationKt.class存在,您可以解压缩它并自己查看。

答案 2 :(得分:0)

Kotlin将Application文件编译为两个不同的文件:

  • 一个名为 Application.class 的文件,其中包含Springboot内容
  • 另一个名为 ApplicationKt.class 的文件,具有主要方法

第二个文件中是 main 函数所在的位置,因此您必须在build.gradle文件中使用该名称。

mainClassName ='org.jetbrains.kotlin.demo.Application Kt '

答案 3 :(得分:0)

如果您的主类文件名为ApplicationKt.class,那么Kotlin确实会在jar中创建文件Application.kt。您必须添加以下行:

apply plugin: 'kotlin'
apply plugin: 'application'
mainClassName = 'org.jetbrains.kotlin.demo.ApplicationKt'

如果您使用经典的jar插件,则可以执行以下操作(前面的回复对此进行了介绍):

jar {
    manifest {
        attributes 'Main-Class': 'org.jetbrains.kotlin.demo.ApplicationKt'
    }
    from { 
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } 
    }
}

但是,我更喜欢使用bootJar插件,该插件非常清晰,例如,我可以使用分层罐子。

bootJar {
    layered() // Not useful if you don't want to use layered jars
}