2016-11-07 2 views
0

モジュール式のプラグインシステムを作るためにJavaでNashornを使用しています。プラグインはJavascriptで書かれています。重要な機能は、Javascriptコードで記述できるハンドラを持つことです。私は始めに、簡単なコマンド体系を目指していました。 javascriptはインターフェイスを実装し、Javaメソッドを呼び出してコマンドを登録します。しかし、私はエラーが発生しています。私はNashorn(var usingNashorn = typeof importClass !== "function";)が真を返すことを確認しました。

Javascriptを:

var CommandListener = Java.extend(Java.type("com.techsdev.scriptengine.listeners.CommandListener"), { 
    invoke : function(sender, command, args) { 
     java.lang.System.out.println("Received a command: " + command); 
    } 
}); 

var listen = function(scriptManager) { 
    var listener = new CommandListener(); 
    scriptManager.registerCommand("plugin name", "test", listener); 
} 

Javaコード: "聞く" 呼び出すに:

'F' が 'エンジンは' NashornたScriptEngine されるJavaScriptファイル ある
try { 
    engine.eval(new FileReader(f)); 
    Invocable invocable = (Invocable) engine; 
    invocable.invokeFunction("listen", this); 
} catch(Exception e) { 
    logger.error("Failed to load script "+f.getName(), e); 
} 

'this'はScriptManagerです

ScriptManagerクラスでは、このメソッドは実際のコマンド:

java.lang.ClassCastException: com.techsdev.scriptengine.listeners.CommandListener$$NashornJavaAdapter cannot be cast to com.techsdev.scriptengine.listeners.CommandListener 
    at com.techsdev.scriptengine.JsScriptManager.registerCommand(JsScriptManager.java:168) ~[scriptengine-mod.jar:?] 
    at jdk.nashorn.internal.scripts.Script$Recompilation$2$616A$\^eval\_.listen(<eval>:22) ~[?:?] 
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:625) ~[nashorn.jar:?] 
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494) ~[nashorn.jar:?] 
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393) ~[nashorn.jar:?] 
    at jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:199) ~[nashorn.jar:?] 
    at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:383) ~[nashorn.jar:?] 
    at jdk.nashorn.api.scripting.NashornScriptEngine.invokeFunction(NashornScriptEngine.java:190) ~[nashorn.jar:?] 
    at com.techsdev.scriptengine.JsScriptManager.loadFile(JsScriptManager.java:134) [JsScriptManager.class:?] 
    at com.techsdev.scriptengine.JsScriptManager.loadFolder(JsScriptManager.java:116) [JsScriptManager.class:?] 
    at com.techsdev.scriptengine.JsScriptManager.init(JsScriptManager.java:104) [JsScriptManager.class:?] 

私が何かを逃した場合は私に知らせてください:

public void registerCommand(String plugin, String command, CommandListener listener) { 
     if(commandHandlers.containsKey(command.toLowerCase())) { 
      logger.warn("Command "+command+" tried to be registered, but is already registered!"); 
      return; 
     } 

     commandHandlers.put(command.toLowerCase(), listener); 
} 

しかし、このコードは、次の例外がスローされます。 ありがとうございます。

答えて

1

com.techsdev.scriptengine.listeners.CommandListenerのクラスローダーは、スクリプトからもJavaコードからでも印刷できます。 JavaScriptから

Javaから
print(Java.type("com.techsdev.scriptengine.listeners.CommandListener").class.classLoader) 

:同じ(完全修飾)という名前のクラスバイトが2つの異なるローダによってロードされている場合

System.out.println(com.techsdev.scriptengine.listeners.CommandListener.class.getClassLoader()); 

、それらの(ランタイム)クラスが異なっていますJVMの視点。 javascriptとJavaコードから異なるクラスローダーが見える場合は、おそらくclasspath/classloaderの問題があります。

+0

問題は実際に私が選択したクラスローダーの一部でした。どうやら、Nashornはそのクラスローダーなどを使用していないのに対し、すべてが別のクラスローダーにロードされているようです。いずれにせよ、それは本当にクラスローダーの問題でした。ありがとうございました! – Rickydaan

関連する問題