【问题标题】:Configuring Gradle with Kotlin使用 Kotlin 配置 Gradle
【发布时间】:2015-11-16 14:58:09
【问题描述】:

我正在尝试将 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!")
}

主模块设置.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 项目窗口中的项目结构

我尝试使用 Intellij 选项来配置带有 Kotlin 的模块(Tools-&gt;Kotlin-&gt;Configure project with Kotlin),但它给我的错误是“所有带有 kotlin 文件的模块都已配置”

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

【问题讨论】:

  • 你为什么使用 Kotlin 0.10?最新版本是 1.0-beta。
  • 没有特别的原因。我试过不同的版本。我认为我的问题与 kotlin 版本有关。
  • 嗯,您显示的堆栈跟踪包含一个在最新 Kotlin 版本中不再存在的类,所以是的,它与 Kotlin 版本有关。请务必使用最新的。

标签: java intellij-idea kotlin


【解决方案1】:

运行 gradlew clean build 时,所有项目都编译成功,但运行 java -jar hello-kotlin-1.0-SNAPSHOT.jar 时出现以下错误...

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

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

而且,Intellij 似乎没有将 src/main/kotlin 目录识别为源目录(它没有标记为蓝色)...

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

可以在herethere 找到文档和有用的资源。

【讨论】:

  • 根据文档,不使用默认目录结构时应该更新'sourceSets',但这不是我的情况。我使用的是默认的,所以我认为将它添加到'build.gradle'中没有意义
  • 您的答案中的 Main-Class 属性不起作用,因为 Kotlin 不会生成名为 HelloKotlin.kt 的类。正确的名字是HelloKotlinKt
  • @AlexanderUdalov 你是绝对正确的,谢谢你的评论。 :)
【解决方案2】:

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

您正在创建的 Jar 不包含 kotlin 运行时,因为 Gradle 只会构建一个包含 您的 类文件的 Jar。我看到你正在使用application 插件,所以要么做$ gradle run 要么创建一个分发并通过提供的shell 脚本执行应该可以正常工作。如果您想将 kotlin 与您的 Jar 一起发布,您需要创建一个 fat jar。

为什么 IDEA 不能识别源目录?

我怀疑这是因为您没有在构建文件中应用idea 插件。我还没有使用 Kotlin 完成任何工作,但是使用其他语言需要这样做才能正确设置工作区。

【讨论】:

  • 我刚刚尝试应用idea插件,但似乎没有效果。我已经重建了项目,甚至重新启动了 IDE,但没有任何改变。
  • 你是如何导入/构建你的项目的?
  • 我已经获取了您的build.gradle 文件,应用了idea 插件,运行$ gradle idea,生成的项目将src/main/kotlin 标记为源目录
  • 我运行 gradlew clean build 来生成 jars。当我靠近我的电脑时,我会尝试你的解决方案:)
  • 我已删除所有 intellij 和 gradle 目录和文件并重新导入项目。现在src/main/kotlin 被正确识别。按照@aga的建议添加from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }后,jar文件就可以运行了。
【解决方案3】:

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

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

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

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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多