2016-12-13 17 views
0

既存のEclipse RCPアプリケーションに第三者プラグインを導入しました。それはそれがそれ自身のバージョンのslf4jを使用しているようです。これを解決して、サードパーティのjarファイルと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プラグインとして含めてみました。ターゲット - >コンテンツビューで、サードパーティのjarとその必要な依存関係にチェックマークを付けます。私が必要とするslf4jジャーもチェックしています。私がproduct-> validationを実行すると、 'no problems detected'と表示されます。私がそれを実行すると、上記のメッセージで爆発します。

助けていただけたら幸いです!

答えて

3

なぜMy3rdPartyLib.my3rdPartyLib_apiはslf4j.apiをエクスポートしていますか?おそらく、インポートするだけでそれを変更することができます。 activemq-allがslf4j.apiもエクスポートするかどうかは表示されません。 1つのアイデアは、activemq-allを使用するのではなく、必要な個々のactivemqパーツを使用することです。すべてのバンドルは便利ですが、パッケージが一緒になってバンドルされていると、システムの他の部分を動かす特定の制約を修正できます。

+0

両方のマニフェストには、「使用」セクションでエクスポートされるslf4jに関する複数のエントリがあります。私がそれらを取り除くとどうなるか分かりません。私はプラグインが私のマニフェストを編集することなく(特に私がそれらを書いていないので)、共存する方法があるはずだと思います。 RCP/OSGIはこれをサポートしていませんか? – ekjcfn3902039

+0

usesディレクティブにリストされていても、エクスポートされているわけではありません。これは、使用パッケージのタイプが、エクスポートされたパッケージのAPIに表示されることを意味します。使用から削除すると、同じタイプ名の異なるクラスオブジェクトが満たされたときに、実行時にClassCastExceptionsが発生する可能性があります。私は、そのAPIを通してslf4jタイプを「漏らしている」ように見えるので、ここではいくつかの欠陥がactivemqにあると言います。 –

+0

2つの別々のプラグインを互いに分離する方法はありませんか? – ekjcfn3902039

関連する問題