Ich habe vier Bündel, die jeweils nur ein Manifest enthalten. Die Bündel sind
appwelche Importecom.example.foo.fragmentundcom.example.barfoowelche exportiertcom.example.foo;uses:=com.example.foo.cfgfoo.fragmentDas ist ein Fragment, das mitfoodiesen Exporten verbunden istcom.example.foo.fragmentundcom.example.foo.fragment.cfg;uses:=com.example.foo.fragmentbarwelche Exportecom.example.barund Importecom.example.foo
Abhängigkeitsdiagramm auf Bundle-Ebene :
app -> bar
| |
| v
| foo
| |
v v
foo.fragment
Wenn ich diese Bundles auf einmal in JBoss AS 7.2 installiere, funktionieren sie einwandfrei. Wenn ich das appBundle jedoch entweder zum ersten Mal oder nach erfolgreichem Start und anschließender Deinstallation nach den anderen installiere , tritt die folgende Verletzung der Verwendungsbeschränkung auf:
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
Die vollständigen Manifeste sind:
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
Ich konnte den obigen Fehler in eigenständigem Apache Felix 4.2.1 nicht reproduzieren.
Was ist die Ursache für dieses Verhalten? Wenn ich die Fragment-Host: com.example.fooZeile aus dem foo.fragmentManifest lösche , kann ich sie appproblemlos und ohne Fehler neu installieren . Ist dies ein Fehler in JBoss AS 7.2?
org.hibernate.annotations, und die OSGi-Plattform löst dies als Abhängigkeit des Spring ORM-Bundles auf, wenn die OSGi-Plattform ohne meine Anwendung gestartet wird. Dann stelle ich meine Anwendung bereit und OSGi kann sie nicht auflösen, da sie nicht mit dem org.hibernate.annotationsin das Spring ORM-Bundle aufgelösten Bundle kompatibel ist. Klingt das machbar?
org.hibernate.annotationsist ein Fragment mit Fragment-Host: com.springsource.org.hibernate.