Javascript javanashorn-ClassNotFoundException-Java.type()

Javascript javanashorn-ClassNotFoundException-Java.type(),javascript,java,bukkit,nashorn,Javascript,Java,Bukkit,Nashorn,我目前正在为Bukkit服务器创建一个插件,但是我在使用Nashorn脚本引擎时遇到了一个问题。我正在评估来自Java插件的外部javascript文件。我无法让我的javascript从插件中导入类,只有标准的java类在工作(如var JavaBool=java.type('java.lang.Boolean');,但没有var Holder=java.type('io.github.advtest1.js.JSHolder');) 每当我尝试加载其中一个时,都会出现以下错误: Caused

我目前正在为Bukkit服务器创建一个插件,但是我在使用Nashorn脚本引擎时遇到了一个问题。我正在评估来自Java插件的外部javascript文件。我无法让我的javascript从插件中导入类,只有标准的java类在工作(如
var JavaBool=java.type('java.lang.Boolean');
,但没有
var Holder=java.type('io.github.advtest1.js.JSHolder');

每当我尝试加载其中一个时,都会出现以下错误:

Caused by: java.lang.ClassNotFoundException: io.github.advtest1.js.JSHolder
经过一段时间的研究,我发现这与我的插件类在类路径中的运行有关,但是当Bukkit本身加载插件并且我不希望服务器有任何其他启动选项时,我如何将其添加到类路径中呢

如果您需要更多信息,请随时询问。
提前谢谢

正如@wero提到的,我需要添加

ClassLoader cl = plugin.getClass().getClassLoader();
Thread.currentThread().setContextClassLoader(cl);
在我从java调用js函数之前


plugin
代表主类(扩展JavaPlugin的类)

正如@wero提到的,我需要添加

ClassLoader cl = plugin.getClass().getClassLoader();
Thread.currentThread().setContextClassLoader(cl);
在我从java调用js函数之前

plugin
代表主类(扩展JavaPlugin的类)

  • Nashorn使用在引擎创建时找到的线程上下文加载器从Java.type API中查找Java类

  • 如果您使用“-classpath”Nashorn命令行选项,Nashorn还将使用另一个加载程序。Nashorn尝试使用在引擎创建期间创建的新加载程序加载类,该加载程序使用指定的类路径初始化。请注意,nashorn命令行选项可以通过“nashorn.args”Java系统属性传递。因此,如果您在其他地方(比如在配置中)指定-Dnashorn.args=“-classpath your_path”,那么Nashorn可以从指定的_路径访问类

如果无法通过系统属性[或在使用“jjs”工具的情况下通过命令行]传递Nashorn引擎选项,则可以按照前面的回答将线程上下文加载器设置为适当的加载器

如果由于其他应用程序依赖关系而不需要这样做,则获取所需类的java.lang.Class对象,并将该对象作为变量公开给脚本(从java代码中,可以获取类对象并调用ScriptEngine.put方法)。然后,脚本可以访问该对象上的“static”属性以获取“type”对象。对于类型对象,通常的“new”、静态方法调用等按预期工作

例如:

import javax.script.*;

public class Main {
   public static void main(String[] args) throws Exception {
       ScriptEngineManager m = new ScriptEngineManager();
       ScriptEngine e = m.getEngineByName("nashorn");
       e.put("Vec", java.util.Vector.class); // replace it with any Class object
       e.eval("var T = Vec.static; var obj = new T()"); // create new Vector
       e.eval("print(obj.getClass())");
   }
}
  • Nashorn使用在引擎创建时找到的线程上下文加载器从Java.type API中查找Java类

  • 如果您使用“-classpath”Nashorn命令行选项,Nashorn还将使用另一个加载程序。Nashorn尝试使用在引擎创建期间创建的新加载程序加载类,该加载程序使用指定的类路径初始化。请注意,nashorn命令行选项可以通过“nashorn.args”Java系统属性传递。因此,如果您在其他地方(比如在配置中)指定-Dnashorn.args=“-classpath your_path”,那么Nashorn可以从指定的_路径访问类

如果无法通过系统属性[或在使用“jjs”工具的情况下通过命令行]传递Nashorn引擎选项,则可以按照前面的回答将线程上下文加载器设置为适当的加载器

如果由于其他应用程序依赖关系而不需要这样做,则获取所需类的java.lang.Class对象,并将该对象作为变量公开给脚本(从java代码中,可以获取类对象并调用ScriptEngine.put方法)。然后,脚本可以访问该对象上的“static”属性以获取“type”对象。对于类型对象,通常的“new”、静态方法调用等按预期工作

例如:

import javax.script.*;

public class Main {
   public static void main(String[] args) throws Exception {
       ScriptEngineManager m = new ScriptEngineManager();
       ScriptEngine e = m.getEngineByName("nashorn");
       e.put("Vec", java.util.Vector.class); // replace it with any Class object
       e.eval("var T = Vec.static; var obj = new T()"); // create new Vector
       e.eval("print(obj.getClass())");
   }
}

这看起来只是
Java
,而不是
JavaScript
…在创建脚本引擎之前设置上下文类加载器是否有帮助,如这里所述@wero我会尝试一下,等一下!对于Arg0n:是的,上面的例子都是javascript,因为这是一个javascript问题。如果我不使用任何其他类来评估java中的脚本,那么效果会很好。@wero好吧,我会坚持使用这个链接。。。我如何准确地获取上下文类加载器并将其设置为线程?好的,我现在得到了它,但现在它抛出了以下内容:
javax.script.ScriptException:TypeError:[JavaClass io.github.advtest1.Log]在第20行中没有这样的函数“warnSel”
哦,是的,warnSel()-方法是公共的和静态的这看起来只是
Java
,而不是
JavaScript
…在创建脚本引擎之前设置上下文类加载器是否有帮助,如这里所述@wero我会尝试一下,等一下!对于Arg0n:是的,上面的例子都是javascript,因为这是一个javascript问题。如果我不使用任何其他类来评估java中的脚本,那么效果会很好。@wero好吧,我会坚持使用这个链接。。。如何准确地获取上下文类加载器并将其设置为线程?好的,我现在得到了它,但现在它抛出了以下内容:
javax.script.ScriptException:TypeError:[JavaClass io.github.advtest1.Log]在第20行中没有这样的函数“warnSel”
噢,是的,warnSel()-方法是公共的和静态的