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

我有四个包,每个包只包含一个清单

  • 进口 com.example.foo.fragmentcom.example.barapp
  • 导出 com.example.foo;uses:=com.example.foo.cfgfoo
  • foo.fragment是附着在 foo上的一个片段,它可以导出 com.example.foo.fragmentcom.example.foo.fragment.cfg;uses:=com.example.foo.fragment
  • 出口 com.example.bar和进口 com.example.foobar

束级依赖关系图 :

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

当我在 JBoss AS 7.2中同时安装这些包时,它们工作得很好。但是如果我安装了 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

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

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

8278 次浏览

您不必在应用程序中导入 foo.part,您的依赖关系将从 foo 解析。所以只要删除这个依赖项并重新部署它。这个问题是因为循环依赖。