我最近将java版本从java 1.7升级到java 1.8。升级后,我收到此错误。
引起:ECMAScript异常:类型错误:找不到ScriptObject和My Interface的公共类加载器。
请帮我解决这个问题。
以下是我的方法
private final ScriptEngine engine;
ScriptEngineManager sem = new ScriptEngineManager();
engine = sem.getEngineByName("nashorn");
public <K> K getNewInterface(MyScript myScript){
ScriptContext ctx = new SimpleScriptContext();
String script = myScript.getScript();
if(Strings.isEmpty(script)) {markInvalid(myScript, "Script is empty", null); return null;}
script += " (function(){return this;})();";
Object thiz;
try{
thiz = engine.eval(script, ctx);
} catch (ScriptException e){
markInvalid(myScript, "Can't execute script", e);
return null;
}
if(thiz==null) {markInvalid(myScript, "Script executed, but context is null", null); return null;}
K ret = (K) ((Invocable)engine).getInterface(thiz, myScript.getScriptInterfaceClass());
if(ret==null) {
markInvalid(myScript, "Script executed, but it's incompatible with required interface", null);
return null;
}else{
myScript.setValid(true);
return ret;
}
}
答案 0 :(得分:1)
为了让Nashorn创建一个接口的实现,它必须创建(在运行时)一个新类,它扩展ScriptObject
(Nashorn的内部本机JS对象表示)和你的接口(假设它的名字叫{ {1}})。
如果有一个可以解析MyInterface
和ScriptObject
的类加载器,那么只能在JVM中创建这样的类。由于MyInterface
通常存在于ext类路径(ScriptObject
)中(在Java 8中),因此需要确保jre/lib/ext
的类加载器具有所谓的“ext类加载器”。它的父类加载器链。这通常是正确的,因为大多数代码都是由JVM应用程序类加载器加载的。如果你有一个更复杂的类加载器设置(例如你在某种应用程序容器中),它可能不是真的。
基本上,看看这是否有效(我认为周围没有安全管理员......):
MyInterface
如果它引发ClassLoader myClassLoader = myScript.getScriptInterfaceClass().getClassLoader();
Class.forName("jdk.nashorn.internal.runtime.ScriptObject", true, myClassLoader);
,您需要找出ClassNotFoundException
没有看到myClassLoader
类的原因。
答案 1 :(得分:0)
问题不在于代码。问题出在应用服务器上。 我使用的是JBoss 6.4.0 Application Server,问题是它在EAP_HOME \ modules \ system \ layers \ base \ sun \ jdk \ main下的module.xml文件中没有nashorn路径。我将缺少的nashorn路径添加到上面路径中提到的module.xml文件中,它解决了我的问题。您也可以使用Jboss 7.0来解决此问题,因为默认情况下它具有nashorn路径。
缺少nashorn路径
<path name="jdk/nashorn/api/scripting"/>
<path name="jdk/nashorn/api/scripting/resources"/>
<path name="jdk/nashorn/internal/codegen"/>
<path name="jdk/nashorn/internal/codegen/types"/>
<path name="jdk/nashorn/internal/ir"/>
<path name="jdk/nashorn/internal/ir/annotations"/>
<path name="jdk/nashorn/internal/ir/debug"/>
<path name="jdk/nashorn/internal/ir/visitor"/>
<path name="jdk/nashorn/internal/lookup"/>
<path name="jdk/nashorn/internal/objects"/>
<path name="jdk/nashorn/internal/objects/annotations"/>
<path name="jdk/nashorn/internal/parser"/>
<path name="jdk/nashorn/internal/runtime"/>
<path name="jdk/nashorn/internal/runtime/arrays"/>
<path name="jdk/nashorn/internal/runtime/linker"/>
<path name="jdk/nashorn/internal/runtime/options"/>
<path name="jdk/nashorn/internal/runtime/regexp"/>
<path name="jdk/nashorn/internal/runtime/regexp/joni"/>
<path name="jdk/nashorn/internal/runtime/resources"/>
<path name="jdk/nashorn/internal/runtime/resources/fx"/>
<path name="jdk/nashorn/internal/runtime/scripts"/>
<path name="jdk/nashorn/internal/tools"/>
<path name="jdk/nashorn/internal/tools/resources"/>
<path name="jdk/internal/dynalink"/>
<path name="jdk/internal/dynalink/beans"/>
<path name="jdk/internal/dynalink/linker"/>
<path name="jdk/internal/dynalink/support"/>