You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:39:03