Felix:无法在 JDK 9 上添加扩展包
Felix: unable to add extension bundle on JDK 9
迁移到 JDK 9+ 后,我们围绕 apache Felix 构建的 OSGi 容器开始无法安装扩展包。错误信息是:
Caused by: org.osgi.framework.BundleException: Could not create bundle object.
at org.apache.felix.framework.Felix.installBundle(Felix.java:3095)
...
Caused by: java.lang.UnsupportedOperationException: Unable to add extension bundle.
at org.apache.felix.framework.ExtensionManager.addExtensionBundle(ExtensionManager.java:439)
at org.apache.felix.framework.Felix.installBundle(Felix.java:3061)
...
我们的Felix版本是5.6.10,目前是最新的。捆绑清单的相关部分:
Created-By: Apache Maven Bundle Plugin
Fragment-Host: system.bundle; extension:=framework
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=9.0))"
Tool: Bnd-3.5.0.201709291849
调试显示用于安装扩展的 class 加载器已移至 JDK 9 中的命名模块。因此必须为所有未命名的 class 加载器打开包模块以便可以从 Felix 框架访问。
添加以下命令行选项后有效:
--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED
对于使用 maven-surefire-plugin 的单元测试,使用:
<configuration>
<argLine>
--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED
</argLine>
</configuration>
解决方案似乎是从 Felix'ExtensionManager 记录下来的,但没有添加到异常消息中,所以在我自己的日志中找不到该消息:
m_logger.log(bundle, Logger.LOG_WARNING,
"Unable to add extension bundle - Maybe ClassLoader is not supported " +
"(on java9, try --add-opens=java.base/jdk.internal.loader=ALL-UNNAMED)?");
迁移到 JDK 9+ 后,我们围绕 apache Felix 构建的 OSGi 容器开始无法安装扩展包。错误信息是:
Caused by: org.osgi.framework.BundleException: Could not create bundle object.
at org.apache.felix.framework.Felix.installBundle(Felix.java:3095)
...
Caused by: java.lang.UnsupportedOperationException: Unable to add extension bundle.
at org.apache.felix.framework.ExtensionManager.addExtensionBundle(ExtensionManager.java:439)
at org.apache.felix.framework.Felix.installBundle(Felix.java:3061)
...
我们的Felix版本是5.6.10,目前是最新的。捆绑清单的相关部分:
Created-By: Apache Maven Bundle Plugin
Fragment-Host: system.bundle; extension:=framework
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=9.0))"
Tool: Bnd-3.5.0.201709291849
调试显示用于安装扩展的 class 加载器已移至 JDK 9 中的命名模块。因此必须为所有未命名的 class 加载器打开包模块以便可以从 Felix 框架访问。
添加以下命令行选项后有效:
--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED
对于使用 maven-surefire-plugin 的单元测试,使用:
<configuration>
<argLine>
--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED
</argLine>
</configuration>
解决方案似乎是从 Felix'ExtensionManager 记录下来的,但没有添加到异常消息中,所以在我自己的日志中找不到该消息:
m_logger.log(bundle, Logger.LOG_WARNING,
"Unable to add extension bundle - Maybe ClassLoader is not supported " +
"(on java9, try --add-opens=java.base/jdk.internal.loader=ALL-UNNAMED)?");