Saya memiliki empat bundel, masing-masing hanya berisi manifes. Bundelnya adalah
appyang mengimporcom.example.foo.fragmentdancom.example.barfooyang mengeksporcom.example.foo;uses:=com.example.foo.cfgfoo.fragmentyang merupakan fragmen yang melekat padafooekspor itucom.example.foo.fragmentdancom.example.foo.fragment.cfg;uses:=com.example.foo.fragmentbaryang eksporcom.example.bardan imporcom.example.foo
Grafik ketergantungan tingkat bundel :
app -> bar
| |
| v
| foo
| |
v v
foo.fragment
Ketika saya menginstal bundel ini sekaligus di JBoss AS 7.2, mereka bekerja dengan baik. Tetapi jika saya menginstal appbundel setelah yang lain, baik untuk pertama kalinya atau setelah berhasil memulai dan kemudian mencopotnya, hal berikut ini menggunakan pelanggaran kendala:
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
Manifes lengkapnya adalah:
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
Saya belum dapat mereproduksi kesalahan di atas di standalone Apache Felix 4.2.1.
Apa penyebab perilaku ini? Jika saya menghapus Fragment-Host: com.example.foobaris dari foo.fragmentmanifes, saya dapat menginstal ulang dengan appbaik tanpa kesalahan. Apakah ini bug di JBoss AS 7.2?
org.hibernate.annotations , dan platform OSGi memutuskan bahwa sebagai ketergantungan dari bundel ORM Musim Semi jika platform OSGi dijalankan tanpa aplikasi saya. Lalu saya menggunakan aplikasi saya, dan OSGi gagal menyelesaikannya karena tidak kompatibel dengan org.hibernate.annotationsbundel yang diselesaikan ke bundel ORM Musim Semi. Apakah itu terdengar masuk akal?
org.hibernate.annotationsadalah sebuah fragmen dengan Fragment-Host: com.springsource.org.hibernate.