我试图复制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')
}
将Applicationkt
更改为ApplicationKt
将起作用,顺便说一句,您可以将Kotlin版本升级到1.2.31
。
通过Applicationkt
我的意思是这一行:
attributes 'Main-Class': 'org.jetbrains.kotlin.demo.Applicationkt'
将build.gradle更新为
jar {
manifest {
attributes 'Main-Class': 'org.jetbrains.kotlin.demo.ApplicationKt'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
在应用程序中使用大写字母K.
这是必需的,因为Kotlin编译为Java字节码的方式。 Kotlin中的fun main()
函数没有附加到任何类,但Java总是需要一个类,并且不支持无类函数。
Kotlin编译器必须创建一个Java类。因为你已经定义了一个类Application
,所以它为你的Kotlin文件Kt
中的函数创建了一个带有后缀org/jetbrains/kotlin/demo/Application.kt
的类。您必须设置此类以便JVM可以找到它。
BTW一个Jar文件只是一个Zip文件,如果ApplicationKt.class存在,您可以解压缩并亲自查看。
Kotlin将应用程序文件编译为两个不同的文件:
在第二个文件中是main函数所在的位置,因此您必须在build.gradle文件中使用此名称。
mainClassName ='org.jetbrains.kotlin.demo.ApplicationKt'