OSGi - 由于进口之间存在冲突,候选排列失败

时间:2011-04-03 09:10:14

标签: osgi

我遇到的情况是我的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.frameworkc.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工具。

问题:在不诉诸有根据的猜测的情况下,解决此类问题的正确方法是什么?

1 个答案:

答案 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标记的版本与实际版本不同。

你现在怎么能解决这个问题?可以通过将httpcmpn连接到同一个framework包来解决两个解析链的问题;也许shell中的一个简单的osgi:refresh可以帮助你,因为声明的版本(1.6.8.RELEASE)在httpcmpn的导入范围内是偶然的。 / p>

如果你真的不需要aspectj的东西,我会把它留下来。