如何解决OSGi对javax.jms 1.1.0-2.0.0版本的依赖需求问题?
嘿,我看你在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

