モジュール式のプラグインシステムを作るために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);
}
しかし、このコードは、次の例外がスローされます。 ありがとうございます。
問題は実際に私が選択したクラスローダーの一部でした。どうやら、Nashornはそのクラスローダーなどを使用していないのに対し、すべてが別のクラスローダーにロードされているようです。いずれにせよ、それは本当にクラスローダーの問題でした。ありがとうございました! – Rickydaan