我的本地目录中有一个.class文件,由以下jasmin代码组成:
.class public default_class
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit locals 10
.limit stack 10
invokestatic main_65428301()I
return
.end method
.method public static main_65428301()I
.limit locals 10
.limit stack 10
ldc "foobar"
astore_0
iconst_0
ireturn
.end method
当我执行java -jar jasmin.jar test.j时,所有内容都编译,我得到.class文件,但是我无法用java default_class启动它,因为我收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError:
at default_class.main(test.j)
Caused by: java.lang.ClassNotFoundException:
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 1 more
我的JAVA_HOME是:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
和classpath只包含我当前的目录(此.class文件所在的目录)。我应该添加一些东西吗?
编辑:
我用来启动课程的命令是java default_class
EDIT2: 好的,最后我弄清楚出了什么问题!该类的名称必须以大写字母开头!这解决了我的问题!无论如何,感谢所有试图帮助我的人!
答案 0 :(得分:1)
您通常需要:
java -cp . NameOfClassWithMainMethod
运行位于当前目录中的单个类文件。但是,如果仔细阅读堆栈跟踪,您将看到Java已找到您的主类和主方法,但找不到其他内容。从您发布的代码中,我看不出是什么。
正在运行
java -verbose:class ......
可能会照亮这种情况,就像使用调试器来观察工作和播放时的类加载器一样。可能使用strace来查看它试图打开的文件。
答案 1 :(得分:0)
您的错误消息显示:
抛出java.lang.ClassNotFoundException:
但此消息的格式通常如下所示:
java.lang.ClassNotFoundException:SomeNonExistingClass
为什么找不到找不到的类的名称?因为您的示例中有一条指令引用了一个空类名("")。因此,您需要查找忘记指定类名的指令。那就是:
invokestatic main_65428301()I
相反它应该是:
invokestatic default_class/main_65428301()I
这将解决您的问题。
怀疑你写道:
EDIT2:好的,最后我发现了什么问题!该类的名称必须以大写字母开头!这解决了我的问题!无论如何,感谢所有试图帮助我的人!
因为没有任何迹象表明这可能是一个原因,实际情况也是如此。