両方のチェーンが同じバンドルで終わっているときに、use制約に違反するのはなぜですか?


151

4つのバンドルがあり、それぞれにマニフェストのみが含まれています。バンドルは

  • app輸入com.example.foo.fragmentcom.example.bar
  • foo どの輸出 com.example.foo;uses:=com.example.foo.cfg
  • foo.fragmentこれはfooそのエクスポートに添付されたフラグメントでcom.example.foo.fragmentあり、com.example.foo.fragment.cfg;uses:=com.example.foo.fragment
  • barどのエクスポートcom.example.barとインポートcom.example.foo

バンドルレベルの依存関係グラフ

app -> bar
|       |
|       v
|      foo
|       |
v       v
foo.fragment

これらのバンドルをJBoss AS 7.2に一度にすべてインストールすると、問題なく動作します。しかし、初めて、または正常に起動してアンインストールした後でappバンドル他のバンドルの後にインストールすると、次の使用制約違反が発生します。

Caused by: org.osgi.service.resolver.ResolutionException: Uses constraint violation. Unable to resolve resource com.example.app [HostBundleRevision[com.example.app:0.0.
0]] because it is exposed to package 'com.example.foo.fragment' from resources com.example.foo [HostBundleRevision[com.example.foo:0.0.0]] and com.example.foo [HostBund
leRevision[com.example.foo:0.0.0]] via two dependency chains.

Chain 1:
  com.example.app [HostBundleRevision[com.example.app:0.0.0]]
    import: null
     |
    export: osgi.wiring.package=com.example.foo.fragment
  com.example.foo [HostBundleRevision[com.example.foo:0.0.0]]

Chain 2:
  com.example.app [HostBundleRevision[com.example.app:0.0.0]]
    import: null
     |
    export: osgi.wiring.package=com.example.bar; uses:=com.example.foo
  com.example.bar [HostBundleRevision[com.example.bar:0.0.0]]
    import: null
     |
    export: osgi.wiring.package=com.example.foo; uses:=com.example.foo.fragment
    export: osgi.wiring.package=com.example.foo.fragment
  com.example.foo [HostBundleRevision[com.example.foo:0.0.0]]
        at org.apache.felix.resolver.ResolverImpl.checkPackageSpaceConsistency(ResolverImpl.java:1142)
        at org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:197)
        at org.jboss.osgi.resolver.felix.StatelessResolver.resolve(StatelessResolver.java:56)
        at org.jboss.osgi.framework.internal.ResolverImpl.resolveAndApply(ResolverImpl.java:137)
        at org.jboss.as.osgi.service.BundleLifecycleIntegration$BundleLifecycleImpl.activateDeferredPhase(BundleLifecycleIntegration.java:296)
        ... 31 more

完全なマニフェストは次のとおりです。

app.jar/META-INF/MANIFEST.MF
----------------------------
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.example.app
Import-Package: com.example.foo.fragment,com.example.bar
----------------------------
foo.jar/META-INF/MANIFEST.MF
----------------------------
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.example.foo
Export-Package: com.example.foo;uses:="com.example.foo.cfg"
-------------------------------------
foo.fragment.jar/META-INF/MANIFEST.MF
-------------------------------------
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.example.foo.fragment
Fragment-Host: com.example.foo
Export-Package: com.example.foo.fragment,com.example.foo.cfg;uses:="co
 m.example.foo.fragment"
----------------------------
bar.jar/META-INF/MANIFEST.MF
----------------------------
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.example.bar
Export-Package: com.example.bar;uses:="com.example.foo"
Import-Package: com.example.foo

スタンドアロンのApache Felix 4.2.1では上記のエラーを再現できませんでした。

この動作の原因は何ですか?マニフェストFragment-Host: com.example.fooから行を削除すると、エラーなしで問題なくfoo.fragment再インストールできappます。これはJBoss AS 7.2のバグですか?


1
これはかなり変だと思う。私はこれをJBoss ASフレームワーク実装のバグと呼んでいますが、その場合は、JBossメーリングリストや課題追跡で報告する必要があります。
Neil Bartlett 2013年

少し試してみたところ、JBossの起動時にアプリケーションがデプロイされていない場合にのみ発生することがわかりました。おそらく、別のバンドルのエクスポートorg.hibernate.annotationsがあり、OSGiプラットフォームがアプリケーションなしで起動した場合、OSGiプラットフォームはそれをSpring ORMバンドルの依存関係として解決します。次に、アプリケーションをデプロイorg.hibernate.annotationsしましたが、Spring ORMバンドルに解決されたバンドルと互換性がないため、OSGiはそれを解決できません。それは実現可能でしょうか?
Emil Lundberg 2013年

4
JBossコミュニティでのディスカッションも開始しました:community.jboss.org/thread/229824
Emil Lundberg

@NeilBartlett質問2の答えを見つけました。バンドルのエクスポートorg.hibernate.annotationsはのフラグメントFragment-Host: com.springsource.org.hibernateです。
Emil Lundberg 2013

1
これはバグのようです。フラグメントバンドルは、ホストバンドルの一部であるかのように動作することになっています。場合によっては、クラスパスの整合性チェックを実行するときに、JBossがフラグメントを別のバンドルとして処理しているようです。
jgibson 2014

回答:


1

依存関係がfooから解決するアプリにfoo.fragmentをインポートする必要はありません。したがって、その依存関係を削除して再デプロイするだけです。この問題は、循環依存関係が原因です。


3
これは循環依存ではありません。foo.fragmentがアプリに依存している場合、循環します。ただし、アプリはfoo.fragmentに依存しているため、サイクルはありません。ただし、アプリからfoo.fragmentへの明示的な依存関係は不要な場合がありますが、それは事実です。
2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.