2016-12-13 6 views
0

제 3 자 플러그인을 기존 Eclipse RCP 응용 프로그램에 도입 했으므로 이제는 더 이상 작동하지 않습니다. 그것은 그것을 사용하고있는 것 같습니다 slf4j의 자신의 버전입니다. 이 문제를 어떻게 해결하고 제 3 자 항아리에있는 slf4j와 조화롭게 공존 할 수 있습니까?컨 스트레인 트 위반으로 인해 번들이 해결되지 않았습니다.

Bundle was not resolved because of a uses contraint violation. 
    org.osgi.service.resolver.ResolutionException: Uses constraint violation. 
    Unable to resolve resource My3rdPartyLib.my3rdPartyLib_api [osgi.identity; 
    osgi.identity="My3rdPartyLib.my3rdPartyLib_api"; type="osgi.bundle"; 
    version:Version="2.4"] because it is exposed to package 'org.slf4j' 
    from resources slf4j.api [osgi.identity; osgi.identity="slf4j.api"; 
    type="osgi.bundle"; version:Version="1.7.21"] and activemq-all 
    [osgi.identity; osgi.identity="activemq-all"; type="osgi.bundle"; 
    version:Version="5.9.0"] via two dependency chains. 

Chain 1: 
    My3rdPartyLib.my3rdPartyLib_api [osgi.identity; 
    osgi.identity="My3rdPartyLib.my3rdPartyLib_api"; type="osgi.bundle"; 
    version:Version="2.4"] 
    import: (osgi.wiring.package=org.slf4j) 
    | 
    export: osgi.wiring.package: org.slf4j 
    slf4j.api [osgi.identity; osgi.identity="slf4j.api"; 
    type="osgi.bundle"; version:Version="1.7.21"] 

Chain 2: 
    My3rdPartyLib.my3rdPartyLib_api [osgi.identity; 
    osgi.identity="My3rdPartyLib.my3rdPartyLib_api"; type="osgi.bundle"; 
    version:Version="2.4"] 
    import: (osgi.wiring.package=org.apache.activemq) 
    | 
    export: osgi.wiring.package: org.apache.activemq; uses:=org.slf4j 
    export: osgi.wiring.package=org.slf4j 
    activemq-all [osgi.identity; osgi.identity="activemq-all"; 
    type="osgi.bundle"; version:Version="5.9.0"] 
    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) 

RCP 플러그인으로 사용해 보았습니다. target-> content view에서 제 3 자 jar와 필요한 종속성에 체크 표시합니다. 나는 내가 필요로하는 slf4j 항아리에도 체크 표시를한다. 제품 -> 유효성 검사를 실행하면 '문제 없음'이 표시됩니다. 내가 그것을 실행할 때, 위의 메시지로 불어납니다.

도움이 될 것입니다.

답변

3

My3rdPartyLib.my3rdPartyLib_api가 slf4j.api를 내보내는 이유는 무엇입니까? 아마도 그것을 가져 오기 위해 변경할 수 있습니다. activemq-all이 slf4j.api를 내보낼 지 여부는 표시하지 않습니다. 하나의 아이디어로는 activemq-all을 사용하지 않고 필요할 때마다 개별적인 activemq 부품을 사용하는 것입니다. 모든 번들은 편리 할 수 ​​있지만 패키지가 함께 묶여 있으면 시스템의 다른 부분을 뒤엎는 특정 제약 조건을 수정할 수 있습니다.

+0

두 매니페스트에는 '사용'섹션에서 내 보낸 slf4j에 대한 여러 항목이 있습니다. 내가 그들을 제거하면 어떻게 될지 잘 모르겠다. 나는 플러그인이 나없이 매니 페스트를 편집하지 않고 공존 할 수있는 방법이 있어야한다고 생각한다 (특히 필자는 글을 쓰지 않았기 때문에). RCP/OSGI가 이것을 지원하지 않습니까? – ekjcfn3902039

+0

uses 지시문에 나와 있다고해서 그것이 내보내기라는 의미는 아닙니다. 사용 된 패키지의 유형이 내 보낸 패키지의 API에서 볼 수 있음을 의미합니다. 사용에서 제거하면 동일한 유형 이름에 대한 서로 다른 클래스 객체가 만나는 런타임에 ClassCastExceptions가 발생할 수 있습니다. 나는 그것의 API를 통해 slf4j 유형을 "누설하는"것처럼 보이기 때문에 여기에있는 결함 중 일부는 activemq에 있다고 말하고 싶습니다. –

+0

그래서 2 개의 개별 플러그인을 서로 분리 할 방법이 없습니까? – ekjcfn3902039