Trying to use Rhino, getEngineByName("JavaScript") returns null in OpenJDK 7
- by Yuval
When I run the following piece of code, the engine variable is set to null when I'm using OepnJDK 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.
I noticed OpenJDK 7 has a different directory structure. Perhaps something is not installed right?
$ locate rhino.jar
/usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar
/usr/lib/jvm/java-7-openjdk-common/jre/lib/rhino.jar
/usr/lib/jvm/java-7-openjdk-i386/jre/lib/rhino.jar
Edit Since ScriptEngineManager uses a ServiceProvider to find the available script engines, I snooped around resources.jar's META-INF/services. I noticed that in OpenJDK 6, resources.jar has a META-INF/services/javax.script.ScriptEngineFactory entry which is missing from OpenJDK 7. Any idea why? I suspect this is a bug?
Here is the contents of that entry (from OpenJDK 6):
#script engines supported
com.sun.script.javascript.RhinoScriptEngineFactory #javascript
Another edit Apparently, according to this thread, the code simply isn't there, perhaps because of merging issues between Sun and Mozilla code. I still don't understand why it was present in OpenJDK 6 and not 7. The class com.sun.script.javascript.RhinoScriptEngineFactory exists in 6's rt.jar but not in 7's. If it was not meant to be included, why is there a OpenJDK 7 rhino.jar then; and why is the source still in the OpenJDK source tree (here)?