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

Emi*_*erg 151 osgi apache-felix jboss7.x

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

  • app哪个进口com.example.foo.fragmentcom.example.bar
  • 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
  • bar哪些出口com.example.bar和进口com.example.foo

捆绑级依赖图:

app -> bar
|       |
|       v
|      foo
|       |
v       v
foo.fragment
Run Code Online (Sandbox Code Playgroud)

当我在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
Run Code Online (Sandbox Code Playgroud)

完整的清单是:

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
Run Code Online (Sandbox Code Playgroud)

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

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

use*_*572 1

您不必在应用程序中导入 foo.fragment 您的依赖项将从 foo 解析。因此,只需删除该依赖项并重新部署即可。这个问题是由于循环依赖造成的。

  • 这**不是循环依赖**。如果 foo.fragment 依赖于 app,那么它将是循环的。但是app依赖于foo.fragment,所以没有循环。然而,从 app 到 foo.fragment 的显式依赖可能是不需要的,这是事实。 (3认同)