Android Studio 上 Kotlin(非安卓)项目的 ClassNotFoundException 错误 [英] ClassNotFoundException error for Kotlin (non-android) project on Android Studio
问题描述
我尝试使用 Android Studio 2.3.3 创建一个普通的 Kotlin 项目(非 Android,只是桌面/命令行项目).
我按照
以下是我的项目文件结构
然后我同步项目,它成功了.但是当我尝试运行该项目时,错误就开始了.我收到以下错误.
"/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java" -Didea.launcher.port=7534 "-Didea.launcher.bin.path=/Applications/Android Studio.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/charsets.jar:/Applications/AndroidStudio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/localedata.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/sunec.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Applications/Android Studio.app/目录/jre/jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/jce.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/jsse.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/management-agent.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/resources.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/rt.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/lib/dt.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/lib/jconsole.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/lib/sa-jdi.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/lib/tools.jar:/Users/haxpor/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a26072a:/用户/haxpor/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.4-2/272a21c30432c943d618008fbbd34762eb0d6c8a/kotlin-stdlib.jars-jre/kotlin-stdlib.1.4/272a21c30432c943d618008/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.4-2/fec983b2608a8a91a1b87dba18d247d692cf6b51/kotlin-stdlib-1.jar/xportgradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.4-2/168cc3f45c307edda6c867dd0635a7d451257551/kotlin-stdlib.1.48Studio.app/Contents/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain io.wasin.testjavaapp.Main线程main"中的异常 java.lang.ClassNotFoundException: io.wasin.testjavaapp.Main在 java.net.URLClassLoader.findClass(URLClassLoader.java:381)在 java.lang.ClassLoader.loadClass(ClassLoader.java:424)在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)在 java.lang.ClassLoader.loadClass(ClassLoader.java:357)在 java.lang.Class.forName0(Native Method)在 java.lang.Class.forName(Class.java:264)在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:123)进程以退出代码 1 结束
我看到上面提供的类路径参数 /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
没有与我的项目相关的目录.尽管我已经在配置中进行了设置,但我不知道如何通过 gradle 添加类路径目录.
我该如何解决这个问题?
更新:
以下是我的Main.kt
代码.它仅用于测试目的.所以只需打印一些东西.
package io.wasin.testjavaapp对象主{@JvmStatic fun main(arg: Array) {println("你好世界")}}
我还更新了 Kotlin 版本的 build.gradle
以匹配 Android Studio 上的 Kotlin 插件版本.现在是 ext.kotlin_version = '1.1.4-2'
.虽然还是没有解决问题.
更新 2
我在 src
目录的同一级别检查了 build
目录.那里没有生成/构建的 .class
或 intermediates
文件,只有 kotlin-build/caches/version.txt
就是这样.没有其他文件.那么问题可能是因为源文件根本没有编译?
更新 3
我尝试创建一个新模块以查看它是否是根本原因.还创建了 assets
文件夹作为工作目录,再次重新排列源文件夹如下.
我们现在有 2 个模块.
testJavaApp
- 根一desktop
- 由Main.kt
组成,用作桌面可执行文件
testJavaApp
有以下 build.gradle
group 'io.wasin'版本1.0-快照"//顶级构建文件,您可以在其中添加常见的配置选项所有子项目/模块.构建脚本{ext.kotlin_version = '1.1.4-2'存储库{jcenter()}依赖{类路径 'com.android.tools.build:gradle:2.3.3'类路径org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"//注意:不要将您的应用程序依赖项放在这里;他们属于//在单独的模块 build.gradle 文件中}}所有项目{存储库{jcenter()}}任务清理(类型:删除){删除 rootProject.buildDir}
还有 desktop
模块有以下 build.gradle
应用插件:'kotlin'sourceSets.main.java.srcDirs = [ "src/" ]project.ext.mainClassName = "io.wasin.testjavaapp.Main"project.ext.assetsDir = new File("../assets");依赖{testCompile 组:'junit',名称:'junit',版本:'4.12'编译org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"}存储库{MavenCentral()}任务运行(依赖:类,类型:JavaExec){main = project.mainClassName类路径 = sourceSets.main.runtimeClasspath标准输入 = System.inworkingDir = project.assetsDir忽略退出值 = 真}
不幸的是,它仍然没有工作,并且出现了同样的错误.
更新 4
@aristotll 在评论中提供了信息,他在 Android Studio 中测试并遇到了同样的问题,但在 IntelliJ 中没有.他说这可能是 Android Studio 的错误.所以我想,我会再试几次,然后决定它是否足够可靠,可以报告为错误.感谢您抽出时间进行测试.
我也遇到了这个问题,解决了.
在build.gradle中添加runtimeClasspath files("build/classes/kotlin/main")
依赖项{//在此组件和使用者的编译类路径上找到此依赖项.编译 'com.google.guava:guava:23.0'//使用 JUnit 测试框架testCompile 'junit:junit:4.12'编译org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"编译组:'dom4j',名称:'dom4j',版本:'1.6.1'运行时类路径文件(build/classes/kotlin/main")}
因为 Android Studio 在 build/classes/kotlin/main
中找不到类.添加 runtimeClasspath
就可以了!
I attempted to create a normal Kotlin project (non-android, just desktop/command line project) with Android Studio 2.3.3.
I followed the steps as laid out here but with different build.gradle
content whose content I shared here.
Actually that content of build.gradle
I copied from build.gradle
file after generating a new project with IntelliJ Community Edition (2017.2).
Then I create a configuration to be able to run it on desktop with proper set up like Main Class, Working directory, and Use classpath of module. You can see in the image below.
and following is the project file structure I have
Then I sync the project, it succeeds. But error kicks in when I try to Run the project. I got the following error.
"/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java" -Didea.launcher.port=7534 "-Didea.launcher.bin.path=/Applications/Android Studio.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/charsets.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/localedata.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/sunec.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/jce.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/jsse.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/management-agent.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/resources.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/rt.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/lib/dt.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/lib/jconsole.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/lib/sa-jdi.jar:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/lib/tools.jar:/Users/haxpor/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar:/Users/haxpor/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.4-2/272a21c30432c943d618008fbbd34762eb0d6c8a/kotlin-stdlib-jre7-1.1.4-2.jar:/Users/haxpor/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.4-2/fec983b2608a8a91a1b87dba18d247d692cf6b51/kotlin-stdlib-1.1.4-2.jar:/Users/haxpor/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.4-2/168cc3f45c307edda6c867dd0635a7d451257551/kotlin-stdlib-jre8-1.1.4-2.jar:/Applications/Android Studio.app/Contents/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain io.wasin.testjavaapp.Main
Exception in thread "main" java.lang.ClassNotFoundException: io.wasin.testjavaapp.Main
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:123)
Process finished with exit code 1
I saw the classpath parameter as supplied in above /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
has no related directory to my project. I don't know how to add classpath directory via gradle despite I set up it in configurations already.
How can I solve this problem?
Update:
The following is my Main.kt
code. It's just for testing purpose. So just printing something out.
package io.wasin.testjavaapp
object Main {
@JvmStatic fun main(arg: Array<String>) {
println("Hello world")
}
}
Also I updated build.gradle
for Kotlin version to match the version of Kotlin plugin on Android Studio. It's now ext.kotlin_version = '1.1.4-2'
. Although still doesn't solve the problem.
Update 2
I checked inside build
directory at the same level of src
directory. There are no .class
or intermediates
files generated/built over there, only kotlin-build/caches/version.txt
and that's it. No other files. So the problem might be due to the source files are not compiled at all?
Update 3
I tried creating a new module to see if it's the root cause or not. Also created assets
folder just to act as Working Directory, rearranged source folder again to be as following.
We now have 2 modules.
testJavaApp
- root onedesktop
- consists ofMain.kt
and used as desktop executable
testJavaApp
has the following code for build.gradle
group 'io.wasin'
version '1.0-SNAPSHOT'
// Top-level build file where you can add configuration options common to
all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.1.4-2'
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
also desktop
module has following code for build.gradle
apply plugin: 'kotlin'
sourceSets.main.java.srcDirs = [ "src/" ]
project.ext.mainClassName = "io.wasin.testjavaapp.Main"
project.ext.assetsDir = new File("../assets");
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
repositories {
mavenCentral()
}
task run(dependsOn: classes, type: JavaExec) {
main = project.mainClassName
classpath = sourceSets.main.runtimeClasspath
standardInput = System.in
workingDir = project.assetsDir
ignoreExitValue = true
}
Unfortunately, it still didn't work and it's the same error that shown up.
Update 4
@aristotll provided info in a comment that he tested with Android Studio and faced the same problem, but not with IntelliJ. He said it might be Android Studio bug. So I guess, I would try a few more times then decide whether it's solid enough to report as a bug. Thanks for taking time to testing out.
I also met this problem and solved it.
Add runtimeClasspath files("build/classes/kotlin/main")
in build.gradle
dependencies {
// This dependency is found on compile classpath of this component and consumers.
compile 'com.google.guava:guava:23.0'
// Use JUnit test framework
testCompile 'junit:junit:4.12'
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
compile group: 'dom4j', name: 'dom4j', version: '1.6.1'
runtimeClasspath files("build/classes/kotlin/main")
}
because Android Studio doesn't find classes in build/classes/kotlin/main
. Add runtimeClasspath
and it works!
这篇关于Android Studio 上 Kotlin(非安卓)项目的 ClassNotFoundException 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!