当前位置: 首页 > 知识库问答 >
问题:

找不到Nashorn ScriptEngine/在Karaf+Felix(openJDK)注册

祁坚壁
2023-03-14

在Karaf+Felix+OpenJDK8环境中加载nashorn脚本引擎时遇到问题:new ScriptEngineManager().getEngineByName(“nashorn”)在该环境中返回null。我使用该代码的测试成功通过,不管是由maven执行(在tje Linux/Debian服务器上html" target="_blank">安装相同的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.

    /etc/config.properties 中,org.osgi.framework.bootderation属性包含jdk.nashorn.*

    我的包还导入/需要jdk.nashorn,felix成功地解析了这一点:

    >bundle:Requirements my-bundle grep-a 1 nashorn
    ...
    osgi.wiring.package;(osgi.wiring.package=jdk.nashorn)解析者:
     OSGI.WIRING.Package;来自org.apache.felix.framework[0]
    ...

  • 共有1个答案

    裴星洲
    2023-03-14

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

    1. 您可以将线程上下文类加载器临时设置为扩展加载器或委托给它的加载器--就在创建ScriptEngineManager对象之前(您可以在找到引擎后设置重置旧的线程上下文类加载器)。
    2. 您可以通过传递适当的ClassLoader来使用ScriptEngineManager的ClassLoader接受构造函数(另请参见:https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngineManager.html#ScriptEngineManager-java.lang.ClassLoader-)。同样,您可以传递扩展类加载器或委托给扩展类加载器的任何加载器-以便通过服务加载器机制找到扩展类加载器可见的引擎。
     类似资料:
    • 我正在尝试在Karaf2.3中安装并启动OSGi用户管理界面的ApacheFelix实现。3. 但是,这个包从来没有得到解决,我在开始时得到以下错误: 正如我在Karaf邮件列表中读到的,Karaf已经嵌入了OSGi概要API,但默认情况下不会导出所有包。我更改了文件以显式导出UserAdmin包: 包似乎是由Karaf导出的,正如我在运行

    • 我正在尝试安装openjdk-8-jdk,建议使用以下命令: 我确实在packages.debian.org手册中找到了它,并试图告诉apt也从那里加载,就像在那个包的镜像页面上建议的那样,通过添加以下行到 /etc/apt/sources.list 但还是找不到包裹。我也试着换了。 http://deb.debian.org/debian网址 sid to buster或buster-backp

    • 对于Java SE应用程序,我使用Apache Felix和weld-osgi。问题是在注入的bean中,我使用了包< code > javax . enterprise . context . ApplicationScoped 中的< code>@ApplicationScoped。但是在< code > weld-OSGi-bundle-2 . 1 . 2 . final 中没有这个包。 此

    • 我们正在Karaf中部署我们的应用程序,并试图使用Flyway来处理数据库迁移,但它在运行时找不到我们的文件。我检查过的东西: > 当我为Flyway启用调试时,我可以看到它在类路径上找到了文件夹,但其中没有文件。 当408与安装的捆绑包匹配时,日志显示它正在查找正确的捆绑包。 我不确定还要查找什么,因为没有记录任何错误,而且它似乎正在查找它应该位于的文件夹,而不是sql文件。我假设这是一个清单类

    • 我使用javax.validation和Hibernate验证器实现了一些代码。使用验证的单元测试工作良好。该构建生成OSGi包和特性,并在Karaf中运行。 “无法创建配置,因为找不到Bean验证提供程序。请将Hibernate Validator(RI)这样的提供程序添加到类路径中。” 我会包括stacktrace,但它对我来说没有什么用。大部分都在我的代码、junit和Paxexam中。 我

    • 在ApacheKaraf中安装一个特性时,我遇到了如下使用约束冲突(Karaf框架是felix,版本是4.2.1) 无法解决。原因:包使用冲突:导入包:组织。阿帕奇。http。实体version=“0.0.0” 谷歌搜索之后,才知道“依赖链”有助于从根本上解决问题。但我不知道要在日志或osgi控制台中打印此依赖项链需要遵循哪些步骤 下面的URL中给出了依赖链示例:Hibernate和ApacheF