6

I tried to copy the Spring Boot Kotlin sample project https://github.com/JetBrains/kotlin-examples/tree/master/tutorials/spring-boot-restful. I Added some more dependencies and when I tried to build the executable jar and run it, I got the error:

Could not find or load main class...

Gradle build script:

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

5 回答 5

6

更改ApplicationktApplicationKt将起作用,顺便说一句,您可以将 Kotlin 版本升级到1.3.50.

Applicationkt我的意思是这一行中的那个:

attributes 'Main-Class': 'org.jetbrains.kotlin.demo.Applicationkt'
于 2018-04-03T06:22:23.843 回答
3

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

  • 一个名为Application.class的文件,其中包含 Springboot 的东西
  • 另一个名为ApplicationKt.class的文件,其中包含 main 方法

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

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

于 2019-02-28T00:43:34.970 回答
2

将您的 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 类。因为您已经定义了一个类,所以它为您的 Kotlin 文件中的函数Application创建了一个后缀。您必须设置此类,以便 JVM 可以找到它。Ktorg/jetbrains/kotlin/demo/Application.kt

顺便说一句,Jar 文件只是一个 Zip 文件,您可以将其解压缩并自己查看 ApplicationKt.class 是否存在。

于 2018-04-03T06:24:49.310 回答
0

实际上,ApplicationKt.class如果您的主类文件名为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非常清晰的插件,它允许我使用分层 jar,例如:

bootJar {
    layered() // Not useful if you don't want to use layered jars
}
于 2020-07-13T13:22:03.717 回答
0

对我来说,主要功能需要在类主体之外

@SpringBootApplication
@Configuration
class Application
(private val locationRepository: LocationRepository,
) : CommandLineRunner {

    override fun run(vararg args: String?) {
        whatever()
    }
}

fun main(args: Array<String>) {
    runApplication<Application>(*args)
}
于 2022-02-05T18:42:07.210 回答