osgi - दोनों श्रृंखलाएं एक ही बंडल में समाप्त होने पर बाधाओं का उपयोग क्यों किया जाता है?



jboss7.x apache-felix (1)

मेरे पास चार बंडल हैं, प्रत्येक में केवल एक मैनिफेस्ट है। बंडल हैं

  • app जो com.example.foo.fragment और com.example.bar आयात करता है
  • foo जो com.example.foo;uses:=com.example.foo.cfg निर्यात 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.foo.fragment.cfg;uses:=com.example.foo.fragment
  • bar जो com.example.bar निर्यात करता है और com.example.foo आयात करता है

बंडल-स्तर निर्भरता ग्राफ :

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

जब मैं इन बंडलों को जेबॉस एएस 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

मैं उपरोक्त त्रुटि को अपाचे फ़ेलिक्स 4.2.1 में पुन: उत्पन्न करने में सक्षम नहीं हूं।

इस व्यवहार का कारण क्या है? अगर मैं Fragment-Host: com.example.foo पंक्ति को foo.fragment manifest से foo.fragment हूं, तो मैं बिना किसी त्रुटि के app ठीक से इंस्टॉल कर सकता हूं। क्या यह जेबॉस एएस 7.2 में एक बग है?


आपको ऐप में foo.fragment आयात करने की आवश्यकता नहीं है, आपकी निर्भरता foo से हल हो जाएगी। तो बस उस निर्भरता को हटा दें और उसे फिर से तैनात करें। यह मुद्दा चक्रीय निर्भरता के कारण है।