2010-12-19 33 views
4

我在使用Rhino,我使用stdlib中的Java類取得了成功,但是我從這裏編譯的Java代碼中獲得了成功。獲取Rhino JS來查看Java類

例如,這工作得很好:

print(new java.util.Date()); 

但隨着NanoHTTPD(單java文件,沒有命名空間,同一文件夾中),我有沒有運氣可言:

js> new Packages.NanoHTTPD() 
js: "<stdin>", line 4: uncaught JavaScript runtime exception: TypeError: [JavaPackage NanoHTTPD] is not a function, it is object. 
    at <stdin>:4 

我相信這很簡單。我錯過了什麼?

編輯:我啓動它是這樣的:

$ CLASSPATH=. java -jar rhino.jar 

或本:

$ java -classpath . -jar rhino.jar 

或者我感動NanoHTTPD.java到文件夾 「./nano」,加入package nano;到文件頂部,編譯它,然後替換爲「。」。在上面的類路徑分配中使用「nano」。

無論如何,我做到這一點,從解釋我看到:

js> java.lang.System.getProperty("java.class.path") 
/Users/me/blah/rhino.jar 

回答

6

你需要這樣運行了犀牛:

java -cp /path/to/rhino/js.jar:. org.mozilla.javascript.tools.shell.Main 

這將當前目錄到classpath中。使用-jar clobbers類路徑。 (類路徑分隔符取決於您的操作系統。)

然後嘗試

js> Packages.NanoHTTPD 
[JavaClass NanoHTTPD] 

如果說[JavaPackage NanoHTTPD],這意味着它已沒有該名稱的一類。

反正你不能實例化NanoHTTPD,所以我猜你想嘗試Packages.NanoHTTPD.main([])什麼的。

+1

啊,這個伎倆!雖然我不知道你爲什麼說我不能實例化NanoHTTPD - 我是,而且它工作正常。 – Ken 2010-12-19 05:51:08

0

確保當前目錄包含在類路徑中。默認的類路徑是當前的目錄,但是如果類路徑已經被設置爲別的東西(比如說犀牛的啓動腳本),那麼你可以碰到這個。

你也可以嘗試將你的測試類放在一個包中,看看它是否與頂級類有一些怪癖。

+0

自從我完成Java以來​​已經有一段時間了 - 你如何做到這一點?我嘗試過'CLASSPATH = .'和'-cp .'(但是System.getProperty(「java.class.path」)只有rhino.jar)和System.setProperty(「java.class.path」,「 。「)(不知道這是否應該工作)。 – Ken 2010-12-19 05:23:26

+0

我試過把我的類放在一個包中(並編譯它),而且我看到的行爲在這種情況下完全相同。 – Ken 2010-12-19 05:32:16

+0

它是windows上的-classpath path1; path2; path3和mac或linux上的-classpath path1:path2:path3。每個路徑元素都是一個jar或一個目錄。你也可以使用-cp,這兩個選項都做同樣的事情。你怎麼發射犀牛?如果使用批處理文件或腳本啓動它,則應該可以編輯腳本以添加所需的類路徑。不,System.setProperty(「java.class.path」,...)將不起作用。 – killdash9 2010-12-19 05:35:11

2

在我的Linux中,我發現命令'rhino'是一個shell腳本,它運行'org.mozilla.javascript.shell.Main'選項'-classpath'。您可以編輯文件以包含班級的路徑。
我認爲這個腳本是自解釋的。 如果你使用Linux,類型:

java -jar ./js.jar

問題使用-jar開關:

less `which rhino` 
2

如果你不打算使用自己的clases犀牛通常你在下面的方式運行你不能在這種情況下定義classpath,並且不設置classpath你不能訪問你自己的包和類。
爲了能夠設置classpath您需要使用-cp開關運行Rhino。在這種情況下,您將classpath通過-cp開關,它應包括犀牛的包,你的包,你也需要通過包內犀牛的主類路徑(org.mozilla.javascript.tools.shell.Main

下面是一個例子如何將自己包到犀牛類路徑:
假設你把你放在mylib.jarmypackage.myclass如果你想獲得這個類可以在你的犀牛會議需要在以下方式運行犀牛:

java -cp "./js.jar;../mylib.jar" org.mozilla.javascript.tools.shell.Main

然後你就可以訪問到你的類:

jc> mc_obj = new Packages.mypackage.myclass()