যখন উভয় চেইন একই বান্ডেলে শেষ হয় তখন কেন ব্যবহারগুলি সীমাবদ্ধতা লঙ্ঘন করা হয়?


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 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

আমি স্বতন্ত্র অ্যাপাচি ফেলিক্স ৪.২.১ এ উপরের ত্রুটিটি পুনরুত্পাদন করতে সক্ষম হইনি।

এই আচরণের কারণ কী? যদি আমি ম্যানিফেস্ট Fragment-Host: com.example.fooথেকে সারিটি মোছা করি foo.fragment, আমি appত্রুটি ছাড়াই ঠিক জরিমানা পুনরায় ইনস্টল করতে পারি । এটি কি জবস এএস 7.2 তে একটি বাগ আছে?


1
আমি সম্মতি জানাই এটি বেশ অদ্ভুত। আমি এটিকে JBoss AS ফ্রেমওয়ার্ক বাস্তবায়নে একটি বাগ বলতে প্রলোভিত করছি, এই ক্ষেত্রে এটি JBoss মেলিং তালিকায় এবং / অথবা ইস্যু ট্র্যাকারটিতে রিপোর্ট করা উচিত।
নীল

এটিকে কিছুটা ব্যস্ত করার পরে, আমি লক্ষ্য করেছি যে এটি কেবল তখনই ঘটে যখন আমার অ্যাপ্লিকেশনটি জবাবস শুরু হওয়ার সাথে সাথে স্থাপন করা হয় না। হতে পারে, সর্বোপরি, অন্য একটি বান্ডিল রফতানি হচ্ছে org.hibernate.annotations, এবং ওএসজি প্ল্যাটফর্মটি সমাধান করে যে ওএসজি প্ল্যাটফর্মটি আমার অ্যাপ্লিকেশন ব্যতীত শুরু হলে স্প্রিং ওআরএম বান্ডেলের নির্ভরতা হিসাবে। তারপরে আমি আমার অ্যাপ্লিকেশন স্থাপন করি এবং ওএসজিআই এটি সমাধান করতে ব্যর্থ হয় কারণ এটি org.hibernate.annotationsস্প্রিং ওআরএম বান্ডেলে সমাধান করা বান্ডেলের সাথে সামঞ্জস্যপূর্ণ নয় । এটা কি সাধ্য আছে?
এমিল লুন্ডবার্গ

4
আমি এখন জেবস সম্প্রদায়েও একটি আলোচনা শুরু করেছি: কমিউনিটি.জবোস.আর
থ্রিড / 229824

@ নীলবার্টলেট আমি কেবল 2 প্রশ্নের উত্তরটি সন্ধান করতে পেরেছি: বান্ডিল রফতানি org.hibernate.annotationsকরা একটি খণ্ড Fragment-Host: com.springsource.org.hibernate
এমিল লুন্ডবার্গ

1
এটি একটি বাগের মতো দেখাচ্ছে। খণ্ডের বান্ডিলগুলি তাদের হোস্ট বান্ডিলের অংশ হিসাবে এমন আচরণ করার কথা রয়েছে t এটি দেখে মনে হচ্ছে কিছু ক্ষেত্রে ক্লাসপাথের ধারাবাহিকতা পরীক্ষা করার সময় জেবস খণ্ডটিকে পৃথক বান্ডিল হিসাবে বিবেচনা করছে।
jgibson

উত্তর:


1

আপনাকে অ্যাপে foo.fraament আমদানি করতে হবে না আপনার নির্ভরতা foo থেকে সমাধান করবে। সুতরাং কেবল সেই নির্ভরতা অপসারণ করুন এবং এটি পুনরায় স্থাপন করুন। এই সমস্যাটি চক্রীয় নির্ভরতার কারণে।


3
এটি চক্রীয় নির্ভরতা নয় । এটি foo.fraament অ্যাপ্লিকেশন উপর নির্ভর করে চক্রযুক্ত হবে। তবে অ্যাপ্লিকেশন foo.fragment এর উপর নির্ভর করে তাই কোনও চক্র নেই। যাইহোক, অ্যাপ থেকে foo.fraਮੈਂਟ পর্যন্ত স্পষ্ট নির্ভরতা অপ্রয়োজনীয় হতে পারে, এটি সত্য।
vog
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.