Saya memiliki empat bundel, masing-masing hanya berisi manifes. Bundelnya adalah
app
yang mengimporcom.example.foo.fragment
dancom.example.bar
foo
yang mengeksporcom.example.foo;uses:=com.example.foo.cfg
foo.fragment
yang merupakan fragmen yang melekat padafoo
ekspor itucom.example.foo.fragment
dancom.example.foo.fragment.cfg;uses:=com.example.foo.fragment
bar
yang eksporcom.example.bar
dan 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 app
bundel 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.foo
baris dari foo.fragment
manifes, saya dapat menginstal ulang dengan app
baik tanpa kesalahan. Apakah ini bug di JBoss AS 7.2?
osgi
jboss7.x
apache-felix
Emil Lundberg
sumber
sumber
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 denganorg.hibernate.annotations
bundel yang diselesaikan ke bundel ORM Musim Semi. Apakah itu terdengar masuk akal?org.hibernate.annotations
adalah sebuah fragmen denganFragment-Host: com.springsource.org.hibernate
.Jawaban:
Anda tidak perlu mengimpor foo.fragment di aplikasi, ketergantungan Anda akan diselesaikan dari foo. jadi hapus saja ketergantungan itu dan gunakan kembali itu. Masalah ini karena ketergantungan siklik.
sumber