如何将指定Java模块嵌入OSGi Bundle?是否具备可实现性?
OSGi Bundle动态访问未预先嵌入JDK模块的解决方案
有可以直接对应module-info中requires效果的Bundle级配置方案,无需修改主应用模块的预嵌入配置,也不需要额外做服务封装,具体实现方式如下:
方案1:Bundle级单独声明依赖JDK模块(推荐)
直接在需要访问java.sql等JDK模块的Bundle的MANIFEST.MF文件中添加Require-Capability配置即可,和module-info的requires作用一致,仅当前Bundle会加载对应的JDK模块:
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=11)(osgi.module=java.sql))"
如果需要依赖多个JDK模块,直接在filter中追加条件即可,示例同时依赖java.sql和java.naming:
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=11)(|(osgi.module=java.sql)(osgi.module=java.naming)))"
该配置对Apache Felix、Eclipse Equinox等所有符合OSGi R7及以上规范的实现都生效。
方案2:全局开放指定JDK模块供所有Bundle使用
如果有多个Bundle需要用到同一个额外JDK模块,可以在OSGi框架启动时添加系统配置,一次性将对应模块的包导出给所有Bundle使用:
- 找到OSGi框架的启动配置项
org.osgi.framework.system.packages.extra - 追加需要开放的JDK模块下的包路径,示例开放
java.sql相关包:org.osgi.framework.system.packages.extra = java.sql,javax.sql,javax.transaction.xa
配置后所有Bundle都可以直接导入使用上述包,无需单独做模块声明。
注意事项
如果运行环境是用jlink裁剪的自定义JRE,需要确保裁剪时已经包含了你要用到的JDK模块,否则无论怎么配置都会抛出类未找到错误。
内容的提问来源于stack exchange,提问作者CodaRuner
相关产品推荐
相关产品推荐

