好的编译JavaScript文件,所以我创建一个包含以下内容命名HelloWorld.js
JavaScript文件:无法执行通过Rhino 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.lang.NoClassDefFoundError
抛出但在运行时在Java类路径中不可用。
所以我跑了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虚拟机无法找到它。这是我困惑的地方。我不知道该从哪里出发,也不知道如何解决这个问题。
我发现,如果我调用犀牛调用exec
方法上的HelloWorld
一个实例如下,我可以执行Java类文件:
java -jar /usr/share/rhino/js.jar HelloWorld.class
不过,我想执行的Java类文件直接使用java HelloWorld
命令,因为js.jar
文件已经在我的类路径中。我想了解问题是什么,以便我知道幕后发生了什么。
'JavaScript文件名为HelloWorld.java' o_O。 Rhino执行'js'(javascript)文件,而不是'Java'文件。为了运行Java程序,人们不需要拥有Rhino。 – kirilloid 2012-03-11 08:34:27
@kirilloid:为了运行由Rhino编译的Java类,需要Rhino运行时库。 – Thilo 2012-03-11 08:37:31
@Thilo Rhino是否将'js'编译为'Java'? – kirilloid 2012-03-11 08:40:49