เหตุใดการใช้ข้อ จำกัด จึงถูกละเมิดเมื่อทั้งสองโซ่สิ้นสุดในชุดข้อมูลเดียวกัน


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

ฉันไม่สามารถทำซ้ำข้อผิดพลาดด้านบนใน Apache Felix แบบสแตนด์อโลนได้

สาเหตุของพฤติกรรมนี้คืออะไร? หากฉันลบFragment-Host: com.example.fooแถวออกจากfoo.fragmentรายการฉันสามารถติดตั้งใหม่ได้appโดยไม่มีข้อผิดพลาด นี่เป็นข้อบกพร่องใน JBoss AS 7.2 หรือไม่


1
ฉันเห็นด้วยว่ามันแปลกดี ฉันถูกล่อลวงให้เรียกสิ่งนี้ว่าข้อบกพร่องในการใช้งานกรอบงาน JBoss AS ซึ่งในกรณีนี้ควรรายงานในรายการส่งเมล JBoss และ / หรือตัวติดตามปัญหา
Neil Bartlett

หลังจากลิงไปรอบ ๆ แล้วฉันสังเกตว่าสิ่งนี้จะเกิดขึ้นก็ต่อเมื่อไม่ได้ปรับใช้แอปพลิเคชันของฉันเมื่อ JBoss เริ่มทำงาน บางทีอาจมีการส่งออกบันเดิลอื่นorg.hibernate.annotationsและแพลตฟอร์ม OSGi แก้ไขว่าเป็นการพึ่งพาการรวมกลุ่มของสปริง ORM หากแพลตฟอร์ม OSGi เริ่มต้นขึ้นโดยไม่มีแอปพลิเคชันของฉัน จากนั้นฉันปรับใช้แอปพลิเคชันของฉันและ OSGi ล้มเหลวในการแก้ไขเนื่องจากไม่สามารถใช้งานร่วมกับorg.hibernate.annotationsบันเดิลที่แก้ไขให้กับบันเดิลสปริง ORM เสียงนั้นเป็นไปได้หรือไม่?
Emil Lundberg

4
ตอนนี้ฉันได้เริ่มการสนทนาในชุมชน JBoss: community.jboss.org/thread/229824
Emil Lundberg

@ NeilBartlett ฉันเพิ่งจะหาคำตอบสำหรับคำถามที่ 2: การส่งออกบันเดิลorg.hibernate.annotationsนั้นเป็นส่วนFragment-Host: com.springsource.org.hibernate
Emil Lundberg

1
ดูเหมือนว่าจะเป็นข้อบกพร่อง บันเดิลแฟรกเมนต์ควรทำตัวราวกับเป็นส่วนหนึ่งของโฮสต์บันเดิลของมันดูเหมือนว่าในบางกรณี JBoss กำลังจัดการแฟรกเมนต์เป็นบันเดิลแยกต่างหากเมื่อดำเนินการตรวจสอบความสอดคล้องของคลาสพา ธ
jgibson

คำตอบ:


1

คุณไม่ต้องนำเข้า foo.fragment ในแอพการพึ่งพาของคุณจะแก้ไขจาก foo ดังนั้นเพียงแค่ลบการพึ่งพานั้นและปรับใช้อีกครั้ง ปัญหานี้เกิดจากการพึ่งพาแบบวนรอบ


3
นี่คือไม่ได้เป็นเมืองขึ้นเป็นวงกลม มันจะเป็นวงจรถ้า foo.fragment ขึ้นอยู่กับแอพ อย่างไรก็ตามแอพขึ้นอยู่กับ foo.fragment ดังนั้นจึงไม่มีวัฏจักร อย่างไรก็ตามการอ้างอิงอย่างชัดเจนจากแอพไปยัง foo.fragment อาจไม่จำเป็นซึ่งเป็นเรื่องจริง
58
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.