J'ai quatre paquets, chacun contenant seulement un manifeste. Les bundles sont
app
qui importecom.example.foo.fragment
etcom.example.bar
foo
qui exportecom.example.foo;uses:=com.example.foo.cfg
foo.fragment
qui est un fragment attaché àfoo
ces exportationscom.example.foo.fragment
etcom.example.foo.fragment.cfg;uses:=com.example.foo.fragment
bar
quelles exportationscom.example.bar
et 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 app
bundle 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.foo
ligne du foo.fragment
manifeste, je peux réinstaller app
trè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.annotations
bundle résolu en bundle Spring ORM. Cela semble-t-il faisable?
org.hibernate.annotations
est un fragment avec Fragment-Host: com.springsource.org.hibernate
.