让Rhino JS看Java类

我正在玩Rhino ,我已经成功使用了stdlib中的Java类,但是没有使用我编译的Java代码。

例如,这很好用:

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

但是使用NanoHTTPD (单个.java文件,没有名称空间,相同的文件夹),我根本就没有运气:

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

你需要像这样运行Rhino:

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

这会将当前目录添加到类路径中。 使用-jar clobbers类路径。 (类路径分隔符取决于您的操作系统。)

然后试试

 js> Packages.NanoHTTPD [JavaClass NanoHTTPD] 

如果它显示[JavaPackage NanoHTTPD] ,则表示它没有找到该名称的类。

无论如何你都无法实例化NanoHTTPD,所以我猜你想尝试一下Packages.NanoHTTPD.main([])东西。

在我的Linux中,我发现命令’rhino’是一个运行’org.mozilla.javascript.shell.Main’的shell脚本,带有’-classpath’选项。 您可以编辑该文件以包含类的路径。
我认为该剧本是自我解释的。 如果使用Linux,请键入:

 less `which rhino` 

如果您不打算在Rhino中使用自己的clases,通常按以下方式运行:

java -jar ./js.jar

使用-jar开关的问题在于,在这种情况下您无法定义classpath ,如果不设置classpath ,则无法访问自己的包和类。
为了能够设置classpath您需要使用-cp开关运行Rhino。 在这种情况下,您可以通过-cp开关设置classpath ,该开关应包含Rhino包和您的包,还需要在包内传递Rhino的主类路径( org.mozilla.javascript.tools.shell.Main

以下是如何将自己的包添加到Rhino类路径的示例:
假设您的类mypackage.myclass放在mylib.jar如果您想在Rhino会话中使用此类,则需要按以下方式运行Rhino:

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

然后你可以访问你的class级:

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

确保当前目录包含在类路径中。 默认的类路径是当前目录,但是如果类路径已被设置为其他东西(例如通过rhino启动脚本),那么您可能遇到此问题。

您也可以尝试将测试类放在一个包中,看看它是否有一些顶级类的怪癖。