6

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

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 は、アプリケーション ファイルを 2 つの異なるファイルにコンパイルします。

  • Springboot のものを含むApplication.classという 1 つのファイル
  • main メソッドを含むApplicationKt.classという別のファイル

この 2 番目のファイルは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 に答える