I have a jar embedded in a bundle that needs to fetch a resource packaged with it like so:
MyBundle
-\ src
-\lib
-\MyEmbeddedJar
-\src
-\SomeClass
-\someResource.xml
I am trying to access ‘someResource.xml’ from ‘SomeClass’ like so:
SomeClass.class.getResource( "someResource.xml" );
But I’ve had no luck. I’ve tried several variations with the CWD appended (eg: ‘./someResource.xml’) but I just can’t get this resource to load.
I know that the “right” way is to use Activator to get hooks back to the proper classloader, but the embedded jar can be used in other projects, so I’d hate to have to add OSGi specific code to it just to get it to play nice with OSGi.
Is there any other way to load resources in OSGi agnostically of OSGi?
I Assume that
SomeClassis inside the embedded jar (say,somejar.jar), andsomeResource.xmlis in the outer jar, in alibdirectory.In this case, there is no way to get to that in a non-OSGi context. Let’s look at both situations in isolation.
In OSGi
Your
someResource.xmlshould very well be reachable using the regular (non-OSGi specific) resource loading mechanisms, provided that it is reachable from theBundle-ClassPath. For instance, if you have the following manifest header,you will be able to get to your resource using
"lib/someResource.xml".Notice the dot on the classpath: this means you can reach classes and resources from the root of the jar. If you forget that, you will only be able to get to classes and resources inside
somejar.jar.Not using OSGi
If you’re not using OSGi, there is no (reasonably simple) way to get to classes and resources inside of the inner jar that I know of.
Your options
Depending on what you want your bundle to look like, you have two options now.
SomeClassis in an embedded jar? If so, you’re at a loss, and you jar will only work using OSGi.somejar.jarinto your jar, you subvert the problem, and your jar can work in both situations.Personally, I’d pick option 2.: unless you have resources that might overwrite each other when you ‘merge’ the jars, it is no problem at all to have a slight mess of resources inside your bundle.