2010-12-19 36 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()