4つのバンドルがあり、それぞれにマニフェストのみが含まれています。バンドルは
app
輸入com.example.foo.fragment
とcom.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の起動時にアプリケーションがデプロイされていない場合にのみ発生することがわかりました。おそらく、別のバンドルのエクスポート
—
Emil Lundberg 2013年
org.hibernate.annotations
があり、OSGiプラットフォームがアプリケーションなしで起動した場合、OSGiプラットフォームはそれをSpring ORMバンドルの依存関係として解決します。次に、アプリケーションをデプロイorg.hibernate.annotations
しましたが、Spring ORMバンドルに解決されたバンドルと互換性がないため、OSGiはそれを解決できません。それは実現可能でしょうか?
JBossコミュニティでのディスカッションも開始しました:community.jboss.org/thread/229824
—
Emil Lundberg
@NeilBartlett質問2の答えを見つけました。バンドルのエクスポート
—
Emil Lundberg 2013
org.hibernate.annotations
はのフラグメントFragment-Host: com.springsource.org.hibernate
です。
これはバグのようです。フラグメントバンドルは、ホストバンドルの一部であるかのように動作することになっています。場合によっては、クラスパスの整合性チェックを実行するときに、JBossがフラグメントを別のバンドルとして処理しているようです。
—
jgibson 2014