为什么当两个链都在同一个包中结束时违反了使用约束?
我有四个包,每个只包含一个清单。 捆绑是
- 导入
com.example.foo.fragment
和com.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.fragment
和com.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出来。 所以只要删除该依赖关系,并重新部署。 这个问题是因为循环依赖。