2010-08-19 38 views
13

Tôi đã tạo hai gói OSGI A và B bằng cách sử dụng trình hướng dẫn dự án Trình cắm thêm nhật thực (sử dụng Helios eclipse).Truy cập tài nguyên trong một gói osgi khác?

Trong tệp kê khai của gói B Tôi đã thêm gói A làm phụ thuộc. Hơn nữa tôi đã xuất các gói trong A để chúng hiển thị cho B. Tôi cũng có tệp .properties trong gói A mà tôi muốn hiển thị cho gói B. Trong ngăn build.properties trong gói AI đã chỉ định:

source.. = src/ 
bin.includes = META-INF/,\ 
       .,\ 
       bundle_A.properties 

Bây giờ trong bó BI cố gắng để tải các tập tin .properties sử dụng:

Nhưng đó đưa ra một ngoại lệ nullpointer (các tập tin không được tìm thấy trên classpath).

Có thể xuất tài nguyên từ gói A (giống như khi bạn xuất gói) hay bằng cách nào đó truy cập tệp trong A từ B theo cách khác (truy cập trình nạp lớp cho gói A từ gói B)?

Trả lời

3

Nếu bạn đang viết một Eclipse plug-in bạn có thể thử một cái gì đó như:

Bundle bundle = Platform.getBundle("your.plugin.id"); 

Path path = new Path("path/to/a/file.type"); 

URL fileURL = Platform.find(bundle, path); 

InputStream in = fileURL.openStream(); 
+0

Điều này dường như không được chấp nhận trong Helios. – JRSofty

2

Bạn đã cân nhắc thêm phương thức để gói API của A để tải và trả về tài nguyên?

Nhiều có thể coi đây là một thiết kế tốt hơn vì nó cho phép tên hoặc phương tiện lưu trữ của tài nguyên thay đổi mà không phá vỡ các khách hàng của bó A.

+0

Cách tiếp cận đó hoạt động khi tôi chạy thử nghiệm plugin. Nhưng khi tôi chạy gói thông qua cấu hình khởi chạy, tệp .properties không thể tìm thấy. Sự khác nhau giữa việc thiết lập cấu hình chạy thử nghiệm và chạy OSGI là gì? – u123

1

Bạn đã cố gắng sử dụng các BundleContext của gói A đến tải các tài nguyên?

+0

Jep và hoạt động tốt, tôi chỉ bối rối vì sao không thể tải tài nguyên từ gói khác bằng cách sử dụng ví dụ: this.getClass(). GetClassLoader(). GetResourceAsStream ( "bundle_A.properties"); khi gói được chỉ định là phụ thuộc và tệp .properties được đặt trong gói được xuất. – u123

+0

Bởi vì 'điều này' là trong bó A. Sử dụng một lớp từ Bó B và nó hoạt động. –

15

Phương pháp getEntry(String) trên Bundle được thiết kế cho mục đích này. Bạn có thể sử dụng nó để tải bất kỳ tài nguyên nào từ bất kỳ gói nào. Ngoài ra, hãy xem các phương pháp findEntries()getEntryPaths() nếu bạn không biết đường dẫn chính xác đến tài nguyên bên trong gói.

Không cần phải giữ bộ nạp lớp của gói để thực hiện việc này.

+1

Cũng lưu ý rằng không cần xuất gói chứa tài nguyên từ gói A. –

0

Hãy thử với /; nếu bạn không đặt /, trình tải lớp sẽ cố tải tài nguyên từ cùng một gói.

this.getClass().getClassLoader().getResourceAsStream("/bundle_A.properties") 
+0

Điều này là sai. Nó sẽ vẫn chỉ sử dụng trình tải lớp của gói B để tìm tài nguyên không hiển thị với trình nạp lớp của gói B / –

Các vấn đề liên quan