osgi - violaciònes - ¿Por qué se violan las restricciones de uso cuando ambas cadenas terminan en el mismo paquete?
que pasa si se violan los derechos humanos (1)
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 implementar eso. Este problema se debe a la dependencia cíclica.
Tengo cuatro paquetes, cada uno contiene 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 afoo
que exportacom.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 a la vez en JBoss AS 7.2, funcionan muy bien. Pero si instalo el paquete de app
después de los demás, ya sea por primera vez o después de iniciarlo con éxito y luego desinstalarlo, se produce la siguiente violación de restricciones 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.
¿Cuál es la causa de este comportamiento? Si Fragment-Host: com.example.foo
fila Fragment-Host: com.example.foo
del manifiesto foo.fragment
, puedo reinstalar la app
sin errores. ¿Es esto un error en JBoss AS 7.2?