我在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配置模板,但是都没有用。我尝试了以下方法:
@JvmStatic
注释的对象中。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的大部分时间里都可以正常工作。
答案 0 :(得分:3)
第一次尝试重现libgdx示例时,一切正常。像您一样,第二次尝试重新导入项目并拍摄屏幕截图的尝试失败了。从那时起,它一直失败。
显然,从gradle导入此项目时,IntelliJ会以某种方式使classpath错误。它寻找build/java/main
而不是build/kotlin/main
。
要解决此问题,请打开项目的“模块设置(F4)”,并将模块desktop
和core
的“模块编译输出路径”更改为kotlin输出路径。只需将路径中的单词java
替换为kotlin
:
当您点击主要方法旁边的“运行”按钮时,它会失败,如下所示:
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,但没有迹象表明它将得到解决。