Tengo cuatro paquetes, cada uno con solo un manifiesto. Los paquetes son
app
que importacom.example.foo.fragment
ycom.example.bar
foo
que exportacom.example.foo;uses:=com.example.foo.cfg
foo.fragment
que es un fragmento adjunto a lasfoo
exportacionescom.example.foo.fragment
ycom.example.foo.fragment.cfg;uses:=com.example.foo.fragment
bar
que exportacom.example.bar
e importacom.example.foo
Gráfico de dependencia de nivel de paquete :
app -> bar
| |
| v
| foo
| |
v v
foo.fragment
Cuando instalo estos paquetes de una vez en JBoss AS 7.2, funcionan bien. Pero si instalo el app
paquete después de los demás, ya sea por primera vez o después de comenzar con éxito y luego desinstalarlo, se produce la siguiente violación de restricción de uso:
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
Los manifiestos completos son:
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
No he podido reproducir el error anterior en Apache Felix 4.2.1 independiente.
¿Cuál es la causa de este comportamiento? Si elimino la Fragment-Host: com.example.foo
fila del foo.fragment
manifiesto, puedo reinstalar app
muy bien sin errores. ¿Es esto un error en JBoss AS 7.2?
osgi
jboss7.x
apache-felix
Emil Lundberg
fuente
fuente
org.hibernate.annotations
, y la plataforma OSGi lo resuelve como la dependencia del paquete Spring ORM si la plataforma OSGi se inicia sin mi aplicación. Luego implemento mi aplicación y OSGi no puede resolverla porque no es compatible con elorg.hibernate.annotations
paquete resuelto en el paquete Spring ORM. ¿Eso suena factible?org.hibernate.annotations
es un fragmento conFragment-Host: com.springsource.org.hibernate
.Respuestas:
No tiene que importar foo.fragment en la aplicación, su dependencia se resolverá desde foo. así que simplemente elimine esa dependencia y vuelva a implementarla. Este problema se debe a la dependencia cíclica.
fuente