Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The method getResourceAsStream returns null on ubuntu

Recently I came accross very strange behaviour of getResourceAsStream method.

I have an application that I developed on Windows. This app is a desktop application based on OSGI framework. I created a bundle, set up needed packages and added some data files to those packages so that they are contained within the jar file.

I load the data using that:

this.getClass().getResourceAsStream("pl/com/myapp/resource.dat");

It worked great both in eclipse and when I deployed my application and run it on the system outside IDE.

I then moved the development to ubuntu 12.04. An to my surprise the method mentioned above always returns null. The data is where it should be. All the settings look OK. No absolute paths in any config files.

I tried many different things. I altered the path to:

this.getClass().getResourceAsStream("/pl/com/myapp/resource.dat");

I tried not to contain the package root but insert a path that is relative to the class location (lets assume that my class is: pl.com.myapp.MyClass):

this.getClass().getResourceAsStream("resource.dat");

I also tried:

this.getClass().getResourceAsStream("./resource.dat");

But nothing worked :(

But when I create a simple Java application everything works smoothly and the method returns the proper stream.

Did anyone come accross such problems ?

I use eclipse-juno on ubuntu 12.04.

like image 436
Marcin Roguski Avatar asked Feb 14 '13 13:02

Marcin Roguski


People also ask

Should we close getResourceAsStream?

You should always close streams (and any other Closeable, actually), no matter how they were given to you. Note that since Java 7, the preferred method to handle closing any resource is definitely the try-with-resources construct.

How do you send paths in getResourceAsStream?

getResourceAsStream , send the absolute path from package root, but omitting the first / . If you use Class. getResourceAsStream , send either a path relative the the current Class object (and the method will take the package into account), or send the absolute path from package root, starting with a / .

How does getResource work in Java?

Class getResource() method in Java with ExamplesThe method returns the specified resource of this class in the form of URL object. Parameter: This method accepts a parameter resourceName which is the resource to get. Return Value: This method returns the specified resource of this class in the form of URL objects.


2 Answers

Be careful at the case sensitivity as Linux paths are case sensitive, compared to the Windows ones.

like image 114
Dan D. Avatar answered Nov 02 '22 00:11

Dan D.


Just a guess, but is it possible that this.getClass() is not the class you think it is? For example if somebody subclasses you then this.getClass() will return the subclass rather than your baseclass, which may be in another bundle and therefore won't have visibility of the resource.

When doing these kind of resource lookups you should always use the literal class name, e.g.: MyClass.class.getResourceAsStream().

like image 35
Neil Bartlett Avatar answered Nov 02 '22 01:11

Neil Bartlett