2012-03-11 18 views
4

好的編譯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文件已經在我的類路徑中。我想了解問題是什麼,以便我知道幕後發生了什麼。

+1

'JavaScript文件名爲HelloWorld.java' o_O。 Rhino執行'js'(javascript)文件,而不是'Java'文件。爲了運行Java程序,人們不需要擁有Rhino。 – kirilloid 2012-03-11 08:34:27

+0

@kirilloid:爲了運行由Rhino編譯的Java類,需要Rhino運行時庫。 – Thilo 2012-03-11 08:37:31

+0

@Thilo Rhino是否將'js'編譯爲'Java'? – kirilloid 2012-03-11 08:40:49

回答

3

您確定該類文件位於類路徑(以及js.jar)嗎?

嘗試

java -cp .;js.jar HelloWorld 

(在當前目錄中假設的HelloWorld.class,否則像-cp build;js.jar)。 `

+0

我發現問題是什麼。我的'HelloWorld'類不在類路徑中。所以我在我的'.bashrc'中更新了下面一行,以反映'export CLASSPATH =/usr/share/rhino/js.jar:$ HOME/class'的變化。然後我將我的'HelloWorld.class'文件移動到'$ HOME/class'。這解決了問題。當我從'class'目錄執行'java HelloWorld'時,它向我顯示輸出沒有任何錯誤。感謝您的幫助。我還有一個問題:當我明確地嘗試執行它時,爲什麼Java虛擬機不能找到我的'HelloWorld.class'文件?我不明白髮生了什麼事。 – 2012-03-11 09:06:40

+0

當前目錄不一定在類路徑中。我認爲,當你在那裏設置其他東西的時候,除非你明確地把它放進去,否則它不會被添加。儘量避免使用環境變量,並使用'-cp'或可運行jar文件或IDE。環境往往會泄漏到不需要它的應用程序中,並將其搞亂。 – Thilo 2012-03-11 09:10:29

+0

有道理。我將繼續使用環境變量進行開發。 '.bashrc'的好處在於它只修改當前用戶的環境變量。對於產品代碼,我將創建一個使用'-classpath'選項來顯式設置類路徑的shell腳本。 =) – 2012-03-11 09:16:36