【问题标题】:Using Nashorn Engine Inside Eclipse Plug-in在 Eclipse 插件中使用 Nashorn 引擎
【发布时间】:2016-08-12 12:50:11
【问题描述】:

我想在 Eclipse 插件中运行以下 sn-p:

String scriptEnteredByUser = "print(\"Hello World\");";
NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine(e -> false);
engine.eval(scriptEnteredByUser);

它不起作用,但在 Eclipse 中带来以下警告:

访问限制:'NashornScriptEngineFactory' 类型不是 API(对所需库 'C:\Program Files (x86)\Java\jdk1.8.0_73\jre\lib\ext\nashorn.jar' 的限制)

并且在运行时出现以下异常:

java.lang.NoClassDefFoundError: jdk/nashorn/api/scripting/NashornScriptEngineFactory

我检查了,nashorn.jar 是 JRE 的死部分,所以它应该可以工作。我也不能使用Import-Package,为什么要使用?这些是 JRE 类/包。

我发现的可能选项以及为什么它们不起作用/不应该使用:

  • nashorn.jar 添加到插件的 lib 文件夹 - 快速而肮脏,并且在 OSGi 上下文中可能有害
  • 仅使用javax.script - 不可能;查看我开始工作所需的代码
  • 围绕 nashorn.jar 创建一个包装包 - 我不知道如果我们有一个导出 JRE 包的包会发生什么,但肯定不行

让 Nashorn 引擎在 Eclipse 插件中工作的正确方法是什么?

【问题讨论】:

  • 为什么不使用:ScriptEngineManager man = new ScriptEngineManager(); ScriptEngine engine = man.getEngineByName("nashorn");
  • @JornVernee 因为我无法使用该 API 设置 ClassFilter

标签: java eclipse-plugin nashorn


【解决方案1】:

您的 Eclipse 可能没有在装有 JDK8 的虚拟机上运行。

  • 转到 cmd 并检查 java -version。
  • Eclipse runtime options:8中指定javahome
  • 删除/卸载其他版本的 JDK,直到您只安装了 JDK 8。

【讨论】:

  • 1) 当然是 Java 8。2) 还有 NoClassDefFoundError。 3) 不能这样做,因为我是开发人员并且需要其他 JDK。我们的客户也不应该这样做,所以这不是一个选择。
  • 删除/卸载其他版本只是一个防故障的想法,以确保您的 Eclipse 确实在 Java 8 中运行......好吧,我没有选择!对不起!
【解决方案2】:

它在运行时配置指定系统属性时起作用 -Dosgi.parentClassloader=ext。该属性记录在Eclipse

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    相关资源
    最近更新 更多