Tôi có bốn bó, mỗi bó chỉ chứa một bảng kê khai. Các gói là
app
nhập khẩucom.example.foo.fragment
vàcom.example.bar
foo
xuất khẩu nàocom.example.foo;uses:=com.example.foo.cfg
foo.fragment
đó là một mảnh gắn liền vớifoo
xuất khẩu đócom.example.foo.fragment
vàcom.example.foo.fragment.cfg;uses:=com.example.foo.fragment
bar
xuất khẩucom.example.bar
và 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 app
gó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.foo
hàng khỏi foo.fragment
tệp kê khai, tôi có thể cài đặt lại app
tốt mà không gặp lỗi. Đây có phải là một lỗi trong JBoss AS 7.2 không?
org.hibernate.annotations
và 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.annotations
gói được phân giải thành gói Spring ORM. Điều đó nghe có khả thi không?
org.hibernate.annotations
là một đoạn với Fragment-Host: com.springsource.org.hibernate
.