How to reference an included file in OSGi bundle when performing java.io.File or FileInputStream

I am using the aQute Bnd toolset to create an OSGi bundle and have packaged with some dependant 'resource' files. This includes *.css files and *.xsd files in a resources directory I have created.

I have included the following in the bundle.bnd file:

Include-Resource: resources/=resources/ 

and when I do a build, the generated *.jar file has the *.css and *.xsd files in the resources directory in the top directory of the jar bundle file.

However, in the actual code I am having difficulty in trying to refer to this as part of my class path:

I have tried the following:

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

I have also tried:

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

I either get a NullPointException error or a File cannot be found IOException error (depending which one I use). I get this error when running in both Eclipse Equinox in Debug Configuration mode as well as Apache Felix (which we are using for our deployment). Note I am trying to do this in Java classes outside of the BundleActivator.

Do I need to always refer to the context of the BundleActivator e.g.?

 /*
 * (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")); 
 }

I think the above will work, but will mean I will have to pass the cssFile reference around which does not appear to be elegant.

Is there any way to refer to the path of the 'resources' directory that is included in the bundle jar file in any given Java class that is part of the bundle/.jar file? If it involves the BundleContext, is there any way to reference this in any Java class?

Any help will be much appreciated.


I have had a look at and Including additional resources with OSGi bundles but it appears that you need the BundleContext.

I might have found a possible solution to this: http://www.vogella.de/blog/tag/plugin/

Looks like Vogella has some example code for this:

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();
}

Does anyone know if this path is the same if it isn't a plugin and if I am using different OSGi environments eg. Equinox Eclipse vs. Apache Felix? e.g. url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt");

11
задан Community 23 May 2017 в 11:45
поделиться