जब दोनों जंजीरें एक ही बंडल में समाप्त हो जाती हैं, तो उल्लंघन का उपयोग क्यों किया जाता है?


151

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

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

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

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

जब मैं इन बंडलों को JBoss 7.2 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, तो मैं appत्रुटियों के बिना ही ठीक कर सकता हूं । यह JBoss 7.2 के रूप में एक बग है?


1
मैं मानता हूं कि यह बहुत अजीब है। मुझे JBoss AS फ्रेमवर्क कार्यान्वयन में इस बग को कॉल करने के लिए लुभाया गया है, जिस स्थिति में इसे JBoss मेलिंग सूची और / या ट्रैकर जारी करना चाहिए।
नील बार्लेट

इसके साथ थोड़ा इधर-उधर भागने के बाद, मैंने देखा कि यह तभी होता है जब JBoss शुरू होने पर मेरा एप्लिकेशन तैनात नहीं होता है। हो सकता है कि आखिरकार, एक और बंडल निर्यात हो रहा हो org.hibernate.annotations, और OSGi प्लेटफ़ॉर्म का निर्धारण होता है कि अगर OSGi प्लेटफ़ॉर्म मेरे अनुप्रयोग के बिना शुरू होता है, तो स्प्रिंग ORM बंडल की निर्भरता के रूप में। तब मैं अपने आवेदन को तैनात करता हूं, और ओएसजीआई इसे हल करने में विफल रहता है क्योंकि यह org.hibernate.annotationsस्प्रिंग ओआरएम बंडल के लिए हल किए गए बंडल के साथ संगत नहीं है। क्या वह ध्वनि संभव है?
एमिल लुंडबर्ग

4
मैंने अब JBoss समुदाय में भी एक चर्चा शुरू की है: community.jboss.org/thread/229824
एमिल लुंडबर्ग

@NeilBartlett मैं अभी प्रश्न 2 के उत्तर का पता लगाता हूं: बंडल निर्यात org.hibernate.annotationsएक टुकड़ा है Fragment-Host: com.springsource.org.hibernate
एमिल लुंडबर्ग

1
यह बग जैसा दिखता है। फ्रैगमेंट बंडलों को माना जाता है जैसे कि वे अपने मेजबान बंडल का हिस्सा हैं। ऐसा लग रहा है कि कुछ मामलों में जेबीओस क्लासपैथ संगतता जांच करते समय टुकड़े को एक अलग बंडल के रूप में मान रहा है।
jgibson

जवाबों:


1

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


3
यह चक्रीय निर्भरता नहीं है । अगर यह foo.fragment ऐप पर निर्भर करता है तो यह चक्रीय होगा। हालाँकि, ऐप foo.fragment पर निर्भर करता है, इसलिए कोई चक्र नहीं है। हालांकि, ऐप से foo.fragment के लिए स्पष्ट निर्भरता को अनावश्यक माना जा सकता है, यह सच है।
वोग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.