views:

162

answers:

3

Hi,

I have a project A, which contains some java files and a classpath resource R.txt. Within the project I use ClassLoader.getSystemResource("R.txt"); to retrieve R.txt.

Then I have a project B which includes project A's jar-file. Now getSystemResource("R.txt") wont find the textfile (and yes, it's still in the root of the jar file). Even trying "/R.txt" as was suggested on some other site didn't work. Any ideas?

Thanks, /Johan

+5  A: 

Use getResource instead of getSystemResource to use a resource specific to a given classloader instead of the system. For example, try any of the following:

URL resource = getClass().getClassLoader().getResource("R.txt");
URL resource = Foo.class.getClassLoader().getResource("R.txt");
URL resource = getClass().getResource("/R.txt");
URL resource = Foo.class.getResource("/R.txt");

Note the leading slash when calling Class.getResource instead of ClassLoader.getResource; Class.getResource is relative to the package containing the class unless you have a leading slash, whereas ClassLoader.getResource is always absolute.

Jon Skeet
Amazing. This completely solved my problem. Thanks for the superfast input // Johan
Johan Sjöberg
+2  A: 

Apparently your JAR is not loaded by the system classloader, so getSystemResource() can't work. This should work:

ClassFromProjectA.class.getClassLoader().getResource("R.txt")

IMO more convenient is putting resources inside the same package as the classes that use them, so you can use the shorter

ClassFromProjectA.class.getResource("R.txt")

(or, inside that class just getClass().getResource("R.txt"))

Michael Borgwardt
+2  A: 

Does ClassLoader.getResource() work ? At the moment you're simply specifying that the system classloader is to be used.

Brian Agnew
Works like a charm. Just had to use the correct classloader :)
Johan Sjöberg