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ẩucom.example.foo.fragmentvàcom.example.barfooxuất khẩu nàocom.example.foo;uses:=com.example.foo.cfgfoo.fragmentđó là một mảnh gắn liền vớifooxuất khẩu đócom.example.foo.fragmentvàcom.example.foo.fragment.cfg;uses:=com.example.foo.fragmentbarxuất khẩucom.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?
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?
org.hibernate.annotationslà một đoạn với Fragment-Host: com.springsource.org.hibernate.