gpt4 book ai didi

java - Nashorn ScriptEngine 未在 Karaf+Felix (openJDK) 上找到/注册

转载 作者:行者123 更新时间:2023-11-30 02:44:33 27 4
gpt4 key购买 nike

我在 Karaf+Felix+OpenJDK8 环境中加载 nashorn 脚本引擎时遇到问题:new ScriptEngineManager().getEngineByName("nashorn")返回null在那个环境中。我使用该代码的测试成功通过,无论是由 maven(在 Linux/Debian 服务器上安装相同的 JDK)还是在我的 Windows 计算机上的 IDE 中执行。

这些是我检查的步骤:

  • Karaf 使用 JDK8 运行,并引用了正确的 ext 目录:

    > ps aux | grep karaf | grep java
    ... -Djava.ext.dirs=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/lib/jvm/java-8-openjdk-amd64/lib/ext:/media/sf_Development/app/apache-karaf-4.0.6/lib/ext ...

  • nashorn.jar 可用:

    > jar -tf /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/nashorn.jar | grep NashornScriptEngineFactory
    jdk/nashorn/api/scripting/NashornScriptEngineFactory.class

  • <karaf>/etc/config.properties org.osgi.framework.bootdelegation属性包含jdk.nashorn.*根据this question

  • 我的包还导入/需要 jdk.nashorn felix 成功解决了这个问题:

    > bundle:requirements my-bundle | grep -A 1 nashorn
    ...
    osgi.wiring.package; (osgi.wiring.package=jdk.nashorn) resolved by:
      osgi.wiring.package; jdk.nashorn 0.0.0 from org.apache.felix.framework [0]
    ...

顺便说一下 new ScriptEngineManager().getEngineFactories() 返回的列表为空,因此无法尝试其他脚本引擎。

有人知道出了什么问题吗?在重新启动 karaf 之前我需要清除一些缓存吗?

最佳答案

ScriptEngineManager 的默认构造函数使用带有服务加载机制的线程上下文类加载器。如果你的线程上下文类加载器没有委托(delegate)给扩展类加载器,那么 nashorn 或任何其他仅对扩展加载器可见的引擎将不会被发现!解决办法有两种:

  1. 您可以在创建 ScriptEngineManager 对象之前临时将线程上下文类加载器设置为扩展加载器或委托(delegate)给它的加载器(并且在找到引擎后设置重置旧的线程上下文类加载器)。
  2. 您可以通过传递适当的 ClassLoader 来使用 ClassLoader 接受 ScriptEngineManager 的构造函数(另请参阅: https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngineManager.html#ScriptEngineManager-java.lang.ClassLoader- )。同样,您可以传递扩展类加载器或委托(delegate)给扩展类加载器的任何加载器 - 以便可以通过服务加载器机制找到扩展加载器可见的引擎。

关于java - Nashorn ScriptEngine 未在 Karaf+Felix (openJDK) 上找到/注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40592786/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com