2010-09-28 36 views
11

Tôi đang sử dụng bộ công cụ aQute Bnd để tạo gói OSGi và đã đóng gói với một số tệp 'tài nguyên' phụ thuộc. Điều này bao gồm các tệp * .css và tệp * .xsd trong thư mục tài nguyên mà tôi đã tạo.Cách tham chiếu tệp được bao gồm trong gói OSGi khi thực hiện java.io.File hoặc FileInputStream

Tôi đã bao gồm những điều sau đây trong bundle.bnd file:

Include-Resource: resources/=resources/ 

và khi tôi làm một xây dựng, được tạo ra file * .jar có * .css và * file XSD trong thư mục tài nguyên trong thư mục trên cùng của tệp gói jar.

Tuy nhiên, trong đoạn code thực tế tôi đang gặp khó khăn trong việc cố gắng để tham khảo này như là một phần của con đường lớp học của tôi:

Tôi đã thử những điều sau đây:

new File("resources/example.css"); 

Tôi cũng đã cố gắng:

URL cssFile = this.getClass().getResource("resources/example.css"); 
try 
{ 
    file = new File(cssFile.toURI())); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 

Tôi nhận được lỗi NullPointException hoặc Không thể tìm thấy tệp IOException error (tùy thuộc vào cách tôi sử dụng). Tôi nhận được lỗi này khi chạy trong cả Eclipse Equinox trong chế độ cấu hình gỡ lỗi cũng như Apache Felix (mà chúng tôi đang sử dụng để triển khai). Lưu ý Tôi đang cố gắng để làm điều này trong các lớp Java bên ngoài của BundleActivator.

Tôi có cần phải luôn luôn tham khảo ngữ cảnh của BundleActivator, ví dụ như không?

/* 
* (non-Javadoc) 
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) 
*/ 
@Override 
public void start(BundleContext context) throws Exception 
{ 
    /* Service to host the Bundle interface. */ 
    ServletContainerService service = new ServletContainerService(); 
    service.addServlet(new ServletContainer(new AxisServlet(), true)); 
    this.serverReg = context.registerService(ServletContainerService.class.getName(), service, null); 

    cssFile = new File(context.getClass.getResource("resource/example.css")); 
} 

Tôi nghĩ rằng ở trên sẽ hiệu quả, nhưng có nghĩa là tôi sẽ phải vượt qua tham chiếu cssFile xung quanh dường như không thanh lịch.

Có cách nào để chỉ đường dẫn của thư mục 'tài nguyên' được bao gồm trong tệp jar gói trong bất kỳ lớp Java đã cho nào là một phần của tệp bó/.jar không? Nếu nó liên quan đến BundleContext, có cách nào để tham khảo điều này trong bất kỳ lớp Java nào không?

Mọi trợ giúp sẽ được đánh giá cao.


Tôi đã xem và Including additional resources with OSGi bundles nhưng có vẻ như bạn cần BundleContext.

tôi có thể đã tìm thấy một giải pháp khả thi như thế này: http://www.vogella.de/blog/tag/plugin/

Hình như Vogella có một số mã ví dụ cho điều này:

URL url; 
try { 
     url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt"); 
    InputStream inputStream = url.openConnection().getInputStream(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); 
    String inputLine; 

    while ((inputLine = in.readLine()) != null) { 
     System.out.println(inputLine); 
    } 

    in.close(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

Có ai biết nếu con đường này là như nhau nếu nó không phải là một plugin và nếu tôi đang sử dụng môi trường OSGi khác nhau ví dụ như. Equinox Eclipse so với Apache Felix? ví dụ: url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt");

Trả lời

9

Các Bundle interface có một phương pháp getEntry(java.lang.String path) mà trả về một Url và được ghi chép lại như sau:

Trả về một URL để nhập cảnh tại các đường dẫn cụ thể trong bộ này. Trình tải lớp của gói này không được sử dụng để tìm kiếm mục nhập. Chỉ nội dung của gói này được tìm kiếm cho mục nhập. Đường dẫn được chỉ định luôn liên quan đến gốc của gói này và có thể bắt đầu bằng "/".Giá trị đường dẫn "/" cho biết gốc của gói này.

+0

Liệu có cách nào để truy cập nó bên ngoài bối cảnh của BundleActivator? Tôi đoán bạn đang đề cập đến làm một cái gì đó như thế này: public void start (BundleContext context) { Bundle bundle = context.getBundle(); InputStream in = bundle.getEntry ("/ resource/example.css"). OpenStream(); }. Tuy nhiên, tôi đang tìm kiếm một giải pháp (nếu có) để truy cập nó bên ngoài BundleActivator. Tôi đã có một cái nhìn tại http://www.eclipsezone.com/eclipse/forums/t101557.html nhưng vẫn còn bối rối – herbyme

+0

Bạn đã tìm cách để có được một đối tượng Bundle từ id gói? –

+0

Tôi có thể nhận được mục nhập, nhưng vấn đề là getEntry() chỉ cung cấp đường dẫn tương đối, và không phải là đường dẫn đầy đủ (gốc) của gói: http://www.techinfopad.com/spring/101600333-getting-root -path-of-a-bundle.html. – herbyme

2

Nếu bạn đang xây dựng với Eclipse/Equinox, sau đó bạn có thể có được vị trí của một Bundle từ outwith các BundleContext chứa trong BundleActivator bằng cách gọi một cái gì đó như:

Bundle yourBundle = Platform.getBundle("bundleSymbolicName"); 
Path relativePathToBundle = new Path("/relativePath"); 
FileLocator.openStream(yourBundle, relativePathToBundle, false); 

Nền tảng và các lớp FileLocator đến từ trình cắm thêm org.eclipse.core.runtime vì vậy nếu bạn có một sự phụ thuộc vào đó thì điều trên sẽ cho phép bạn truy cập vào tài nguyên của bạn.

+0

Tôi đang cố gắng tránh sử dụng plugin org.eclipse.core.runtime cho việc triển khai của chúng tôi quyết định được đưa ra để sử dụng Apache Felix (trừ khi có phương tiện kết hợp điều này). Các công việc trên nếu tôi chạy nó trong môi trường chạy Eclipse. – herbyme

3

Tôi nghĩ câu trả lời nên càng đơn giản như sau:

URL cssFile = this.getClass().getResource("/resources/example.css"); 

Tức là đảm bảo có dấu gạch chéo hàng đầu trong đường dẫn. Bạn đã có nó mà không có một dấu gạch chéo hàng đầu, mà sẽ làm cho nó "tương đối" với lớp bạn đang gọi từ.

Ngoài những điều sau đây nên làm việc:

this.getClass().getClassLoader().getResource("resources/example.css"); 
+0

Tôi đã chọn giải pháp này nhưng có vấn đề với việc cố gắng nhập tất cả các giá trị của thư mục, ví dụ: Tôi đang sử dụng BluePrint CSS và có vấn đề với this.getClass(). GetClassLoader(). GetResource ("resources/css") vì không chỉ có nhiều tệp mà còn là thư mục con. Tôi đã kết thúc 'sao chép' các tập tin vào một vị trí tạm thời, nhưng điều này gây ra một số vấn đề hiệu suất. – herbyme

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