由'使用约束违规'引起的OSGI包异常

时间:2015-06-17 16:38:52

标签: java eclipse osgi osgi-bundle

我正在尝试通过插件片段在eclipse PMD插件中扩展规则。当我尝试测试我的代码时,我得到了这个错误,这似乎是由我的一个插件的依赖项目引起的。

!ENTRY net.sourceforge.pmd.eclipse.plugin 4 0 2015-06-17 09:30:10.972
!MESSAGE FrameworkEvent ERROR
!STACK 0
org.osgi.framework.BundleException: Could not resolve module: net.sourceforge.pmd.eclipse.plugin [1086]
  Bundle was not resolved because of a uses contraint violation.
  org.osgi.service.resolver.ResolutionException: Uses constraint violation. Unable to resolve resource net.sourceforge.pmd.eclipse.plugin [osgi.identity; osgi.identity="net.sourceforge.pmd.eclipse.plugin"; type="osgi.bundle"; version:Version="4.0.7.v20150522-1709"; singleton:="true"] because it exports package 'org.apache.log4j' and is also exposed to it from resource org.apache.log4j [osgi.identity; osgi.identity="org.apache.log4j"; type="osgi.bundle"; version:Version="1.2.15.v201012070815"] via the following dependency chain:

  net.sourceforge.pmd.eclipse.plugin [osgi.identity; osgi.identity="net.sourceforge.pmd.eclipse.plugin"; type="osgi.bundle"; version:Version="4.0.7.v20150522-1709"; singleton:="true"]
    require: (&(osgi.wiring.bundle=de.fu_berlin.inf.archnemesis)(bundle-version>=1.0.0))
     |
    provide: osgi.wiring.bundle; osgi.wiring.bundle="de.fu_berlin.inf.archnemesis"; bundle-version:Version="1.0.0.qualifier"; singleton:="true"
  org.eclipse.xtext.util [osgi.identity; osgi.identity="org.eclipse.xtext.util"; type="osgi.bundle"; version:Version="2.8.3.v201506010551"]
    import: (&(osgi.wiring.package=org.apache.log4j)(version>=1.2.15))
     |
    export: osgi.wiring.package: org.apache.log4j
  org.apache.log4j [osgi.identity; osgi.identity="org.apache.log4j"; type="osgi.bundle"; version:Version="1.2.15.v201012070815"]
    at org.eclipse.osgi.container.Module.start(Module.java:434)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1582)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1561)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1533)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1476)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)

任何人都可以解码此错误消息的含义以及解决方法吗?

1 个答案:

答案 0 :(得分:1)

我认为问题是由于Require-Bundle捆绑中的net.sourceforge.pmd.eclipse.plugin指令与Export-Package的{​​{1}}指令相结合(这或多或少只是一个改写felix错误消息)。

必需的bundle org.apache.log4j导入log4j,同时de.fu_berlin.inf.archnemesis在其类路径中有log4j jar(因为它导出它,这就是它告诉你的错误信息)。这会导致org.apache.log4j包重复并触发错误。

尝试从运行时删除et.sourceforge.pmd.eclipse.plugin捆绑包,以便让org.apache.log4j解析来自de.fu_berlin.inf.archnemesis的log4。

另请阅读this post关于解决OSGi“使用”约束违规行为作者:Neil Bartlett:我发现它非常有趣。