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?
osgi
jboss7.x
apache-felix
Emil Lundberg
la source
la source
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 leorg.hibernate.annotations
bundle résolu en bundle Spring ORM. Cela semble-t-il faisable?org.hibernate.annotations
est un fragment avecFragment-Host: com.springsource.org.hibernate
.Réponses:
Vous n'avez pas besoin d'importer foo.fragment dans l'application que votre dépendance résoudra à partir de foo. alors supprimez simplement cette dépendance et redéployez-la. Ce problème est dû à la dépendance cyclique.
la source