Tại sao các ràng buộc sử dụng bị vi phạm khi cả hai chuỗi kết thúc trong cùng một gói?


151

Tôi có bốn bó, mỗi bó chỉ chứa một bảng kê khai. Các gói là

  • appnhập khẩu com.example.foo.fragmentcom.example.bar
  • foo xuất khẩu nào com.example.foo;uses:=com.example.foo.cfg
  • foo.fragmentđó là một mảnh gắn liền với fooxuất khẩu đó com.example.foo.fragmentcom.example.foo.fragment.cfg;uses:=com.example.foo.fragment
  • barxuất khẩu com.example.barvà nhập khẩucom.example.foo

Biểu đồ phụ thuộc cấp độ gói :

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

Khi tôi cài đặt tất cả các gói này cùng một lúc trong JBoss AS 7.2, chúng hoạt động tốt. Nhưng nếu tôi cài đặt appgói này sau các gói khác, lần đầu tiên hoặc sau khi khởi động thành công và sau đó gỡ cài đặt nó, thì việc sử dụng vi phạm ràng buộc sau đây sẽ xảy ra:

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

Các biểu hiện đầy đủ là:

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

Tôi đã không thể tái tạo lỗi trên trong Apache Felix 4.2.1 độc lập.

Nguyên nhân của hành vi này là gì? Nếu tôi xóa Fragment-Host: com.example.foohàng khỏi foo.fragmenttệp kê khai, tôi có thể cài đặt lại apptốt mà không gặp lỗi. Đây có phải là một lỗi trong JBoss AS 7.2 không?


1
Tôi đồng ý điều này là khá kỳ lạ. Tôi muốn gọi đây là một lỗi trong triển khai khung JBoss AS, trong trường hợp đó, nó sẽ được báo cáo trong danh sách gửi thư của JBoss và / hoặc trình theo dõi vấn đề.
Neil Bartlett

Sau khi loay hoay với nó một chút, tôi nhận thấy rằng điều này chỉ xảy ra nếu ứng dụng của tôi không được triển khai khi JBoss khởi động. Rốt cuộc, có thể có một gói xuất khác org.hibernate.annotationsvà nền tảng OSGi giải quyết rằng đó là sự phụ thuộc của gói Spring ORM nếu nền tảng OSGi khởi động mà không có ứng dụng của tôi. Sau đó, tôi triển khai ứng dụng của mình và OSGi không giải quyết được vì nó không tương thích với org.hibernate.annotationsgói được phân giải thành gói Spring ORM. Điều đó nghe có khả thi không?
Emil Lundberg

4
Bây giờ tôi cũng đã bắt đầu một cuộc thảo luận trong cộng đồng JBoss: Community.jboss.org/thread/229824
Emil Lundberg

@NeilBartlett Tôi chỉ tìm ra câu trả lời cho câu hỏi 2: xuất khẩu gói org.hibernate.annotationslà một đoạn với Fragment-Host: com.springsource.org.hibernate.
Emil Lundberg

1
Điều này trông giống như một lỗi. Các gói mảnh được cho là hoạt động như thể chúng là một phần của gói máy chủ của chúng. Có vẻ như trong một số trường hợp, JBoss đang coi mảnh đó là một gói riêng khi thực hiện kiểm tra tính nhất quán của đường dẫn.
jgibson

Câu trả lời:


1

Bạn không phải nhập foo.fragment trong ứng dụng, sự phụ thuộc của bạn sẽ giải quyết từ foo. vì vậy chỉ cần loại bỏ sự phụ thuộc đó và triển khai lại. Vấn đề này là do sự phụ thuộc theo chu kỳ.


3
Đây không phải là một phụ thuộc theo chu kỳ . Sẽ là chu kỳ nếu foo.fragment phụ thuộc vào ứng dụng. Tuy nhiên, ứng dụng phụ thuộc vào foo.fragment, vì vậy không có chu kỳ. Tuy nhiên, sự phụ thuộc rõ ràng từ ứng dụng vào foo.fragment có thể không cần thiết, đó là sự thật.
vog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.