为什么当两个链都在同一个包中结束时违反了使用约束?

我有四个包,每个只包含一个清单。 捆绑是

  • 导入com.example.foo.fragmentcom.example.bar app
  • 其中导出com.example.foo;uses:=com.example.foo.cfg foo com.example.foo;uses:=com.example.foo.cfg
  • foo.fragment这是一个附加到foo的片段,导出com.example.foo.fragmentcom.example.foo.fragment.cfg;uses:=com.example.foo.fragment
  • 它导出com.example.bar并导入com.example.foo

捆绑级依赖关系图

 app -> bar | | | v | foo | | vv foo.fragment 

当我在JBoss AS 7.2中同时安装这些软件包时,它们工作得很好。 但是,如果我在第一次安装app之后 ,或者在成功启动然后卸载它之后安装app包,则会发生以下使用约束违例:

 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 

充分的体现是:

 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 

我无法在独立的Apache Felix 4.2.1中重现上述错误。

这种行为的原因是什么? 如果我从foo.fragment清单中删除了Fragment-Host: com.example.foo行,我可以foo.fragment重新安装app 。 这是JBoss AS 7.2中的一个错误吗?

你不必在应用中导入foo.fragment,你的依赖将从foo中parsing出来。 所以只要删除该依赖关系,并重新部署。 这个问题是因为循环依赖。