我遇到的情况是我的Felix OSGi容器在部署groovy之后无法正常启动:
obr:部署“Groovy Scripting Languge”@ 1.7.3
管理部署&得到了Groovy的东西,直到我在我的OSGi容器上重启...然后大多数捆绑都无法启动。 FWIW,我很确定Groovy不是原因,即使它的包名中有拼写错误。 : - )
经过一些故障排除后,打开Felix的电线记录(感谢上帝!),我注意到了这一点(在所有其他失败的捆绑包中,类似的原因):
2011-04-03 16:26:43,108 DEBUG [FelixStartLevel] felix.wire - Candidate permutation failed due to a conflict between imports; will try another if possible. (org.apache.felix.framework.resolver.ResolveException: Unable to resolve module org.apache.felix.http.bundle [36.0] because it is exposed to package 'org.osgi.framework' from org.apache.felix.framework [0] and com.springsource.org.aspectj.tools [47.0] via two dependency chains. Chain 1: org.apache.felix.http.bundle [36.0] import: (&(package=org.osgi.framework)(version>=1.3.0)) | export: package=org.osgi.framework org.apache.felix.framework [0] Chain 2: org.apache.felix.http.bundle [36.0] import: (&(package=org.osgi.service.log)(version>=1.3.0)) | export: package=org.osgi.service.log; uses:=org.osgi.framework osgi.cmpn [15.0] import: (&(package=org.osgi.framework)(version>=1.5.0)(!(version>=2.0.0))) | export: package=org.osgi.framework com.springsource.org.aspectj.tools [47.0])
似乎o.a.felix.framework
和c.s.o.aspectj.tools
都在导出o.osgi.framework
。
我可以通过删除包ID 47(c.s.o.aspectj.tools
)来重新运行,但还要检查是否还有其他含义。感觉不对,因为我删除了c.s.o.aspectj.tools
但是它被OBR存储库指示为Groovy的必需(或可选)。实际上,它是通过Groovy的obr:deploy命令安装的。
像c.s.o.aspectj.tools
这样的感觉不应该导出o.osgi.framework
,但这只是猜测,因为我不使用aspectj工具。
问题:在不诉诸有根据的猜测的情况下,解决此类问题的正确方法是什么?
答案 0 :(得分:1)
你是对的,c.s.o.aspectj.tools
不应该导出org.osgi.framework
,但显然确实如此。确切地说,我检查了版本1.6.8
,并且具有以下导出语句:
org.osgi.framework;version="1.6.8.RELEASE"
此外,它不会导入 org.osgi.framework
。这很简单错误,我说它值得与Spring团队一起进行bug报告;如果你导出,你通常应该导入,我想不出有正当理由用osg.osgi.framework
标记的版本与实际版本不同。
你现在怎么能解决这个问题?可以通过将http
和cmpn
连接到同一个framework
包来解决两个解析链的问题;也许shell中的一个简单的osgi:refresh
可以帮助你,因为声明的版本(1.6.8.RELEASE
)在http
和cmpn
的导入范围内是偶然的。 / p>
如果你真的不需要aspectj
的东西,我会把它留下来。