好的編譯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