使用 Kotlin 配置 Gradle

Configuring Gradle with Kotlin

我正在尝试将 kotlin 与 gradle 一起使用,但我无法使用 Intellij Idea 15 成功创建项目。

我创建了包含两个模块 hello-javahello-kotlin 的简单项目。

hello-java 是普通的 java 项目,它正在编译并且 运行 非常好。

hello-kotlin 是一个简单的 kotin 模块,只有一个 *.kt 文件和 build.gradle 文件。
以下是来源:

build.gradle

group 'pl.fzymek.kotlin'
version '1.0-SNAPSHOT'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:0.10.4"
    }
}

apply plugin: 'kotlin'
apply plugin: 'application'

mainClassName = 'HelloKotlinKt'

repositories {
    mavenCentral()
}

jar {
    manifest {
        attributes 'Main-Class': mainClassName
    }
}

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

HelloKotlin.kt

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

主模块settings.gradle

include 'hello-java'
include 'hello-kotlin'

当运行 gradlew clean build 所有项目都编译成功,但是当运行 java -jar hello-kotlin-1.0-SNAPSHOT.jar 我得到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
        at HelloKotlinKt.main(HelloKotlin.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

此外,Intellij 似乎无法将 src/main/kotlin 目录识别为源目录(未标记为蓝色)并且我在编辑 HelloKotlin.kt 文件时无法使用自动完成功能。

这是我在 Intellij 项目中的项目结构 window

我尝试使用 Intellij 选项通过 Kotlin (Tools->Kotlin->Configure project with Kotlin) 配置模块,但它给我的错误是 "All modules with kotlin files are configured"

帮我Whosebug,你是我唯一的帮助。

为什么我的应用程序没有 运行?

您正在创建的 Jar 不包括 kotlin 运行时间,因为 Gradle 只会使用 您的 class 里面的文件。我看到您正在使用 application 插件,因此无论是执行 $ gradle run 还是创建分发并通过提供的 shell 脚本执行都应该可以正常工作。如果你想用你的 Jar 运送 kotlin,你需要创建一个 fat jar。

为什么IDEA不识别源目录?

我怀疑这是因为您没有在构建文件中应用 idea 插件。我没有用 Kotlin 做过任何工作,但是对于其他语言,这是正确设置工作区所必需的。

When running gradlew clean build all projects are compiled successfully, but when running java -jar hello-kotlin-1.0-SNAPSHOT.jar I get following error...

jar {
    manifest {
        attributes 'Main-Class': 'HelloKotlinKt'
    }

    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

What is more, Intellij seems not to recognize src/main/kotlin directory as source directory (it's not marked in blue)...

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

可以找到文档和有用的资源 here and there

我只是按照文档中的说明进行操作,并且一切正常。 “Kotlin 源代码可以与 Java 源代码混合在同一文件夹或不同文件夹中。默认约定是使用不同的文件夹:

project
    - src
        - main (root)
            - kotlin
            - java

如果不使用默认约定,则应更新相应的 sourceSets 属性:

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

希望对你有所帮助。