J'ai quatre paquets, chacun contenant seulement un manifeste. Les bundles sont
appqui importecom.example.foo.fragmentetcom.example.barfooqui exportecom.example.foo;uses:=com.example.foo.cfgfoo.fragmentqui est un fragment attaché àfooces exportationscom.example.foo.fragmentetcom.example.foo.fragment.cfg;uses:=com.example.foo.fragmentbarquelles exportationscom.example.baret importationscom.example.foo
Graphique de dépendance au niveau du bundle :
app -> bar
| |
| v
| foo
| |
v v
foo.fragment
Lorsque j'installe ces bundles en même temps dans JBoss AS 7.2, ils fonctionnent très bien. Mais si j'installe le appbundle après les autres, soit pour la première fois, soit après avoir démarré et désinstallé avec succès, la violation de contrainte d'utilisation suivante se produit:
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
Les manifestes complets sont:
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
Je n'ai pas pu reproduire l'erreur ci-dessus dans Apache Felix 4.2.1 autonome.
Quelle est la cause de ce comportement? Si je supprime la Fragment-Host: com.example.fooligne du foo.fragmentmanifeste, je peux réinstaller apptrès bien sans erreurs. Est-ce un bogue dans JBoss AS 7.2?
org.hibernate.annotations, et la plate-forme OSGi résout cela en tant que dépendance du bundle Spring ORM si la plate-forme OSGi démarre sans mon application. Ensuite, je déploie mon application et OSGi ne parvient pas à la résoudre car elle n'est pas compatible avec le org.hibernate.annotationsbundle résolu en bundle Spring ORM. Cela semble-t-il faisable?
org.hibernate.annotationsest un fragment avec Fragment-Host: com.springsource.org.hibernate.