Classpath resource within jar

28,740

Solution 1

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.

Solution 2

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"))

Solution 3

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

Share:
28,740

Related videos on Youtube

Johan Sjöberg
Author by

Johan Sjöberg

Updated on July 09, 2022

Comments

  • Johan Sjöberg
    Johan Sjöberg almost 2 years

    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?

  • Johan Sjöberg
    Johan Sjöberg over 14 years
    Amazing. This completely solved my problem. Thanks for the superfast input // Johan
  • Johan Sjöberg
    Johan Sjöberg over 14 years
    Works like a charm. Just had to use the correct classloader :)
  • Ensom Hodder
    Ensom Hodder over 11 years
    One more related question: we may get InputStream from this URL resources, but how could we create a File object from the returned URL object. I tried to create a URI object with the "URLObject.toURI()", and use this URI object to create a file, unfortunately, it throws an "URI is not hierarchical exception". Could you give me some help ? Thanks a lot .
  • Jon Skeet
    Jon Skeet over 11 years
    @EnsomHodder: Um, not sure - but not all resources are files - in particular, it won't be if it's in a jar file.
  • asgs
    asgs over 11 years
    Thanks for the explanation of when the / is needed.
  • Jon Skeet
    Jon Skeet about 10 years
    @Jeff: I've rolled back the edit because Class.ClassLoader isn't a classname. The method is in the ClassLoader class. Yes, you often call Class.getClassLoader() to get a classloader, but the call is still ClassLoader.getResource...