我在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 /分机:/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:要求my-bundle | grep -A 1 nashorn ... osgi.wiring.package; (osgi.wiring.package = jdk.nashorn)解决方法:osgi.wiring.package;来自org.apache.felix.framework [0]的jdk.nashorn 0.0.0 ...
顺便说一下 new ScriptEngineManager().getEngineFactories()
返回的列表是空的,所以它不是尝试另一个脚本引擎的选项 .
有人知道出了什么问题吗?在重启karaf之前我是否需要清除一些缓存?
1 回答
ScriptEngineManager的默认构造函数使用线程上下文类加载器和服务加载器机制 . 如果您的线程上下文类加载器没有委托给扩展类加载器,那么将无法找到nashorn或仅对扩展加载器可见的任何其他引擎!有两种解决方案:
您可以临时将线程上下文类加载器设置为扩展加载器或委托给它的加载器 - 就在创建ScriptEngineManager对象之前(并在找到引擎后设置重置旧线程上下文类加载器) .
您可以通过传递适当的ClassLoader来使用ClassLoader接受ScriptEngineManager的构造函数(另请参阅:https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngineManager.html#ScriptEngineManager-java.lang.ClassLoader-) . 同样,您可以传递扩展类加载器或任何委托给扩展类加载器的加载器 - 以便可以通过服务加载器机制找到扩展加载器可见的引擎 .