Java 由';使用约束冲突';

Java 由';使用约束冲突';,java,eclipse,osgi,osgi-bundle,Java,Eclipse,Osgi,Osgi Bundle,我试图通过插件片段扩展EclipsePMD插件中的一条规则。当我试着测试我的代码时,我得到了这个错误,它似乎是由我的插件的一个依赖项目引起的 !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.sour

我试图通过插件片段扩展EclipsePMD插件中的一条规则。当我试着测试我的代码时,我得到了这个错误,它似乎是由我的插件的一个依赖项目引起的

!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)

任何人都可以解码此错误消息的含义以及如何修复它吗

我认为问题是由于
net.sourceforge.pmd.eclipse.plugin
包中的
Require Bundle
指令与
org.apache.log4j
Export-Package
指令(这或多或少只是对felix错误消息的重新表述)

所需的bundle
de.fu_berlin.inf.archnemesis
导入log4j,同时
et.sourceforge.pmd.eclipse.plugin
的类路径中有log4j jar(因为它导出了它,所以它会告诉您错误消息)。这会导致org.apache.log4j包重复并触发错误

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

还可以阅读Neil Bartlett关于解决OSGi“使用”约束冲突的文章:我发现这非常有趣