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

如何解决OSGi对javax.jms 1.1.0-2.0.0版本的依赖需求问题?

解决OSGi中javax.jms 1.1依赖缺失的困扰

嘿,我看你在OSGi依赖上卡壳了——明明装了Geronimo 1.1 JMS规范包,还是被要求满足osgi.wiring.package=javax.jms)(version>=1.1.0)(!(version>=2.0.0))的依赖条件,而且pom里没直接引javax.jms却一直被追着要,RedHat那边也没找到解决方案是吧?我来帮你捋捋问题出在哪,怎么解决:

问题根源拆解

咱先搞清楚为啥会出现这个情况:

  • 依赖传递“暗戳戳”引入:你pom里没直接加javax.jms,但activemq-camel或者com.ibm.mq.allclient这些依赖,大概率间接引入了JMS相关类,导致OSGi容器解析bundle时必须找对应的包。
  • Maven Bundle Plugin配置“打架”:你的插件配置里有两个重复的<instructions>块!后面的配置会直接覆盖前面的,这就导致你之前写的javax.jms; version=[1.1.0,3)导入规则完全失效了,容器只能用默认逻辑,死死盯着1.1.x版本要。

具体解决步骤

1. 先把插件配置的“冲突”给修好

把两个<instructions>块合并成一个,确保JMS的导入规则能生效。修改后的插件配置应该是这样:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.3.7</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
            <Private-Package>com.ups.ttg.ao.fuse.acarsrequest</Private-Package>
            <Import-Package>
                *,
                org.apache.camel.osgi;resolution:=optional,
                org.apache.log4j,
                javax.jms; version="[1.1.0,3)"
            </Import-Package>
            <manifestLocation>src/main/resources/META-INF</manifestLocation>
        </instructions>
    </configuration>
</plugin>

这样配置后,OSGi容器就会接受1.1.0到3.0.0之间的javax.jms版本,正好匹配你装的Geronimo 1.1规范包。

2. 显式控制JMS版本,把传递依赖“管起来”

虽然没直接引,但咱可以在<dependencies>里加个显式依赖,牢牢控制版本,避免传递依赖搞事情:

<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-jms_1.1_spec</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope>
</dependency>

加scope=provided是因为你已经在OSGi容器里装过这个包了,不用把它打包进你的bundle里。

3. 去OSGi控制台确认JMS包状态

登录JBoss Fuse控制台,执行这条命令看看已安装的JMS包:

osgi:list | grep javax.jms

确保输出里有版本在1.1.0到2.0.0之间的包,而且状态是Active。要是没有,就重新装一下:

install -s mvn:org.apache.geronimo.specs/geronimo-jms_1.1_spec/1.1.1

4. 清理缓存重新构建

最后执行这条Maven命令,清掉旧缓存重新打包:

mvn clean install

把新生成的bundle部署到Fuse里,再看看依赖错误是不是消失了。

额外小提示

JBoss Fuse 6.3本身应该自带符合要求的JMS规范包,说不定是之前安装的时候出了小问题,或者你原来的导入规则太严导致匹配不上。另外记住,以后别在maven-bundle-plugin里写多个<instructions>块,Maven只会认最后一个,前面的配置全白写!

内容的提问来源于stack exchange,提问作者user13955339

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:12:38