使用kotlin的自定义风格中的ClassNotFoundException

我定义了我自己的风格,并设置sourceSet:

sourceSets { main.java.srcDirs += 'src/main/kotlin' // WORKS myflavor.java.srcDirs += 'src/myflavor/kotlin' // DOESN'T WORK } 

这里是我的项目结构:

在这里输入图像描述

但是…我收到以下错误:

 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{xyz/xyz.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "xyz.MainActivity" on path: DexPathList[[zip file "/data/app/xyz/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.ClassNotFoundException: Didn't find class "xyz.MainActivity" on path: DexPathList[[zip file "/data/app/xyz/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.ClassLoader.loadClass(ClassLoader.java:469) at android.app.Instrumentation.newActivity(Instrumentation.java:1065) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)        at android.app.ActivityThread.access$800(ActivityThread.java:144)        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)        at android.os.Handler.dispatchMessage(Handler.java:102)        at android.os.Looper.loop(Looper.java:135)        at android.app.ActivityThread.main(ActivityThread.java:5221)        at java.lang.reflect.Method.invoke(Native Method)        at java.lang.reflect.Method.invoke(Method.java:372)        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Suppressed: java.lang.ClassNotFoundException: xyz.MainActivity at java.lang.Class.classForName(Native Method) at java.lang.BootClassLoader.findClass(ClassLoader.java:781) at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) at java.lang.ClassLoader.loadClass(ClassLoader.java:504) ... 13 more Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available 

然而,使用主要的源代码工程…我将不胜感激您的帮助。

这是Android的kotlin-gradle插件中的一个bug,它将被固定在0.9.488或更高。 感谢您的报告!

在我的情况下,我忘了在gradle文件中apply plugin: 'kotlin-android' 。 虽然我的项目已经成功构建,但它在运行时抛出java.lang.ClassNotFoundException 。 我正在使用Kotlin 1.1.1

当我把源代码转换成kotlin时,我也得到了错误。 我的修复正在改变gradle中的sourceSets。

之前

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

现在

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

尝试添加两个main.java.srcDirs,因为你想让他们都编译是吗?

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

我可以确认,至少在Kotlin插件版本1.1.1和1.1.2中,这个bug已经修复,你可以使用不同风格的kotlin文件夹( 建议不要使用java文件夹 ):

 sourceSets { androidTest { java.srcDir file('src/androidTest') } test.java.srcDirs += 'src/test/kotlin' main.java.srcDirs += 'src/main/kotlin' flavor1.java.srcDirs += 'src/flavor1/kotlin' flavor2.java.srcDirs += 'src/flavor2/kotlin' } 

我遇到过同样的问题。 在我的情况下,我正在建立一个图书馆和一个测试应用程序来访问图书馆。

当我将项目转换为kotlin时,它将相关的kotlin依赖关系添加到库的gradle文件中,但不包括主应用程序。

确保所有相关的gradle文件中包含以下行:

 apply plugin: "kotlin-android" dependencies { ... implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" ... }