CLASSPATH启动一个简单的本地类文件

时间:2013-01-06 12:09:27

标签: java classpath classloader jasmin

我的本​​地目录中有一个.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: 好的,最后我弄清楚出了什么问题!该类的名称必须以大写字母开头!这解决了我的问题!无论如何,感谢所有试图帮助我的人!

2 个答案:

答案 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:好的,最后我发现了什么问题!该类的名称必须以大写字母开头!这解决了我的问题!无论如何,感谢所有试图帮助我的人!

因为没有任何迹象表明这可能是一个原因,实际情况也是如此。