Java 在Karaf+;未找到/注册Nashorn ScriptEngine;Felix(openJDK)

Java 在Karaf+;未找到/注册Nashorn ScriptEngine;Felix(openJDK),java,apache-karaf,apache-felix,nashorn,Java,Apache Karaf,Apache Felix,Nashorn,在Karaf+Felix+OpenJDK8环境中加载nashorn脚本引擎时遇到问题:new ScriptEngineManager()。getEngineByName(“nashorn”)在该环境中返回null。我使用该代码的测试成功通过,无论是由maven执行(在tje Linux/Debian服务器上使用相同的JDK安装)还是在我的Windows机器上的IDE中执行 以下是我检查的步骤: Karaf使用JDK8运行,并引用了正确的ext目录: >ps aux| grep karaf|gr

在Karaf+Felix+OpenJDK8环境中加载nashorn脚本引擎时遇到问题:
new ScriptEngineManager()。getEngineByName(“nashorn”)
在该环境中返回
null
。我使用该代码的测试成功通过,无论是由maven执行(在tje 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

  • /etc/config.properties
    中,根据

  • My bundle还导入/需要
    jdk.nashorn
    ,felix成功解决了该问题:

    >bundle:requirements my bundle|grep-A 1 nashorn

    osgi.wiring.package;(osgi.willing.package=jdk.nashorn)解析为:
    osgi.wiring.package;org.apache.felix.framework[0]中的jdk.nashorn 0.0.0

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


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

ScriptEngineManager的默认构造函数使用线程上下文类加载器和服务加载器机制。如果您的线程上下文类加载器没有委托给扩展类加载器,那么将找不到nashorn或仅对扩展加载器可见的任何其他引擎!有两种解决方案:

  • 您可以在创建ScriptEngineManager对象之前,将线程上下文类加载器临时设置为扩展加载器或委托给它的加载器(并且在找到引擎后设置重置旧线程上下文类加载器)
  • 通过传递适当的类加载器,可以使用ScriptEngineManager的类加载器接受构造函数(另请参见:)。同样,您可以传递扩展类加载器或委托给扩展类加载器的任何加载器,以便可以通过服务加载器机制找到对扩展加载器可见的引擎

  • 谢谢你的提示!它与系统类加载器一起工作:
    newscriptenginemanager(ClassLoader.getSystemClassLoader())
    。这是正确的方法吗?对我来说,这看起来有点糟糕。如果没有设置“正确”的线程上下文类加载器,那么您正在使用另一个已发布的API(ScriptEngineManager类)。所以,很好!