When I run the following piece of code, the engine
variable is set to null
when I'm using OpenJDK 7 (java-7-openjdk-i386
).
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class TestRhino {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
try {
System.out.println(engine.eval("1+1"));
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
It runs fine with java-6-openjdk
and Oracle's jre1.7.0
. Any idea why?
I'm using Ubuntu 11.10. All JVMs are installed under /usr/lib/jvm
.
[Update: This was a bug, which has now been fixed]
In short, this might be a bug.
Rhino support classes (
com.sun.script.javascript.*
) are not compiled intort.jar
1 (though I found references to this being a merging issue between Sun and Mozilla, and I know there have been namespace issues, they do exist in the OpenJDK 7 source and are referenced in the makefile), and they're missing fromresources.jar
'sMETA-INF/services
as well. This is not the case with OpenJDK 6, which has this as aMETA-INF/services/javax.script.ScriptEngineFactory
entry:Though this might be a distro decision2 there is no written reason for it, so I filed a bug #982501 in the Ubuntu OpenJDK 7 launchpad. Will give a better answer once I get one.
1 according to this thread,
There have also been some collision issues caused by conflicting versions of JRE and a BYOR (bring-you-own-Rhino) version (e.g. bug #255149 on Ubuntu OpenJDK 7 launchpad). However, the source is in the OpenJDK 7 source and mentioned in the makefile, and BSD port, mentioned in the above thread, has identical sources.
2 According to this Sun bug #6876736, this is to a distro-based decision:
Somewhat in contrast to the fact that they're checked in to the OpenJDK mercurial, but I think the idea is that Rhino is not in the JDK spec.
You must register the Rhino service, but I do not know exactly how, is by creating a file inside META-INF
OR You can skip the Script API and use it directly.
Check this basic example:
https://github.com/mozilla/rhino/blob/master/examples/Control.java