Kotlin和IntelliJ-无法找到或加载主类

时间:2019-05-25 13:34:49

标签: intellij-idea kotlin jvm

我在IntelliJ中有一个Kotlin项目并使用Gradle。我的主类是名为Main.kt的文件中的简单顶级函数。

fun main(args: Array<String>) {
    // Do stuff
}

但是每次我尝试启动程序时,它总是显示相同的错误:Error: Could not find or load main class com.example.MainKt。我尝试了Application和Kotlin配置模板,但是都没有用。我尝试了以下方法:

  • 清洁/重建项目
  • 使缓存无效/重新启动
  • 重新导入Gradle项目
  • 删除.idea文件夹
  • 将我的顶级函数放入带有@JvmStatic注释的对象中。
  • 删除并重新创建配置文件
  • 从头开始创建项目
  • 完全重新安装IntelliJ
  • 我的源集正确,构建文件夹,类路径模块,文件包都正确设置。构建任务在启动之前运行。实际上,在MainKt.class文件夹下和生成的jar文件中有一个build/文件。

您可能会猜到,我已经厌倦了尝试。我设法得到的最好的结果是一个java.lang.ClassNotFoundException错误,但我不记得怎么回事。

我知道的唯一解决方案是执行gradle任务:

tasks.register<JavaExec>("run") {
    main = "com.example.MainKt"
    classpath = sourceSets.main.get().runtimeClasspath
    standardInput = System.`in`
    isIgnoreExitValue = true
}

但是我不想这样做,因为控制台变得很奇怪,并且我无法使用IntelliJ的配置窗口传递参数。

有人遇到过这个问题,如何解决?自从我更新到IntelliJ 2019.1以来,这只是我自己发生的事情,它在2018.3.6的大部分时间里都可以正常工作。

编辑:Gradle设置 enter image description here

2 个答案:

答案 0 :(得分:3)

第一次尝试重现libgdx示例时,一切正常。像您一样,第二次尝试重新导入项目并拍摄屏幕截图的尝试失败了。从那时起,它一直失败。

显然,从gradle导入此项目时,IntelliJ会以某种方式使classpath错误。它寻找build/java/main而不是build/kotlin/main

要解决此问题,请打开项目的“模块设置(F4)”,并将模块desktopcore的“模块编译输出路径”更改为kotlin输出路径。只需将路径中的单词java替换为kotlin

module settings

当您点击主要方法旁边的“运行”按钮时,它会失败,如下所示:

Caused by: java.lang.IllegalStateException: GLFW windows may only be created on the main thread and that thread must be the first thread in the process. Please run the JVM with -XstartOnFirstThread. For offscreen rendering, make sure another window toolkit (e.g. AWT or JavaFX) is initialized before GLFW.

可以通过编辑启动配置并将-XstartOnFirstThread添加到VM选项来解决此问题。

下次尝试失败,出现此异常。

com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load dependencies of asset: libgdx.png

将启动配置中的工作目录更改为android/assets目录时,就像您在gradle任务中所做的那样,演示将成功启动。

记录我的环境:

OS: MacOs Mojave
JVM: openjdk version "1.8.0_212" (AdoptOpenJDK)
IntelliJ: 2019.1.3 Ultimate Edition

答案 1 :(得分:2)

该问题来自该项目具有Android模块的事实。该模块需要android gradle插件,该插件已全局应用于项目中的所有模块,即使不是Android模块的模块也是如此。当应用于模块时,它将添加一个 Android-Gradle 构面,该构面将模块类路径从默认的out/classes更改为build/classes/java。对于kotlin模块,由于类路径错误,因此无法在运行时找到主类。

目前无法将android插件仅应用于android模块。解决方法包括修补android.jar文件,在同步时自动删除Android-Gradle方面或将android模块移至外部项目。没有干净的方法可以做到这一点。

问题has already been reported here,但没有迹象表明它将得到解决。