web-dev-qa-db-ja.com

両方のチェーンが同じバンドルで終了するときに、使用の制約に違反するのはなぜですか?

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

  • appcom.example.foo.fragmentおよびcom.example.barをインポートします
  • fooエクスポートするcom.example.foo;uses:=com.example.foo.cfg
  • foo.fragmentは、com.example.foo.fragmentおよびcom.example.foo.fragment.cfg;uses:=com.example.foo.fragmentをエクスポートするfooに添付されたフラグメントです
  • barcom.example.barをエクスポートし、com.example.fooをインポートします

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

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

これらのバンドルをJBoss AS 7.2に一度にインストールすると、正常に機能します。しかし、appバンドルafterをインストールする場合、初めて、または正常に起動してからアンインストールした後、次のように使用します制約違反が発生します:

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のバグですか?

151
Emil Lundberg

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

1
user3555572