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");
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
Bạn đã tìm cách để có được một đối tượng Bundle từ id gói? –
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