好的,因此我创建了一个名为HelloWorld.js
的JavaScript文件,其内容如下:
java.lang.System.out.println("Hello World!");
现在,我使用Rhino JavaScript编译器并使用以下命令对其进行了编译(
js.jar
文件在我的类路径中):java org.mozilla.javascript.tools.jsc.Main HelloWorld.js
它按预期方式编译了JavaScript文件并创建了Java类文件。然后,我尝试通过调用
java HelloWorld
执行Java类文件。但是,它生成以下错误消息:Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: HelloWorld. Program will exit.
我试图了解是什么导致了
java.lang.NoClassDefFoundError
的引发,并且从我在blog post中阅读的内容得知,如果在编译期间存在某个类,但在运行时Java类路径中不存在该类,则会引发java.lang.NoClassDefFoundError
。所以我运行了
javap HelloWorld
命令来检查问题所在,这就是我得到的结果:public class HelloWorld extends org.mozilla.javascript.NativeFunction implements org.mozilla.javascript.Script {
public HelloWorld();
public static void main(java.lang.String[]);
public final java.lang.Object exec(org.mozilla.javascript.Context, org.mozilla.javascript.Scriptable);
public final java.lang.Object call(org.mozilla.javascript.Context, org.mozilla.javascript.Scriptable, org.mozilla.javascript.Scriptable, java.lang.Object[]);
public int getLanguageVersion();
public java.lang.String getFunctionName();
public int getParamCount();
public int getParamAndVarCount();
public java.lang.String getParamOrVarName(int);
public boolean getParamOrVarConst(int);
}
现在,我从中了解到的是
HelloWorld
类存在并声明为public
。因此,Java虚拟机找不到它应该没有任何理由。这就是我感到困惑的地方。我不知道从这里去哪里,也不知道如何解决这个问题。我发现如果我调用Rhino在
exec
实例上调用HelloWorld
方法,则可以执行Java类文件,如下所示:java -jar /usr/share/rhino/js.jar HelloWorld.class
但是,我想直接使用
java HelloWorld
命令执行Java类文件,因为js.jar
文件已经在我的类路径中。我想了解问题所在,以便了解幕后真正发生的事情。 最佳答案
您确定类文件位于类路径(以及js.jar)上吗?
尝试
java -cp .;js.jar HelloWorld
(假设HelloWorld.class在当前目录中,否则类似
-cp build;js.jar
)。