I understand from What is the difference between Class.getResource() and ClassLoader.getResource()? and from own code, that
getClass().getResource(\"/path/i
I thought this question was already asked and answered!
- What is the difference between Class.getResource() and ClassLoader.getResource()?
getClass().getResource()
searches relative to the .class file whilegetClass().getClassLoader().getResource()
searches relative to the classpath root.
If there's an SSCCE here, I don't understand why it doesn't
1) Show the directory organization in the .jar, and...
2) Take package into consideration
Q: What (if anything) hasn't already been answered by What is the difference between Class.getResource() and ClassLoader.getResource()? (and the links it cites)?
=========================================================================
I'm still not sure what isn't clear, but this example might help:
/*
SAMPLE OUTPUT:
ClassLoader.getResource(/subdir/readme.txt): NULL
Class.getResource(/subdir/readme.txt): SUCCESS
ClassLoader.getResource(subdir/readme.txt): SUCCESS
Class.getResource(subdir/readme.txt): NULL
*/
package com.so.resourcetest;
import java.net.URL;
public class ResourceTest {
public static void main(String[] args) {
ResourceTest app = new ResourceTest ();
}
public ResourceTest () {
doClassLoaderGetResource ("/subdir/readme.txt");
doClassGetResource ("/subdir/readme.txt");
doClassLoaderGetResource ("subdir/readme.txt");
doClassGetResource ("subdir/readme.txt");
}
private void doClassLoaderGetResource (String sPath) {
URL url = getClass().getClassLoader().getResource(sPath);
if (url == null)
System.out.println("ClassLoader.getResource(" + sPath + "): NULL");
else
System.out.println("ClassLoader.getResource(" + sPath + "): SUCCESS");
}
private void doClassGetResource (String sPath) {
URL url = getClass().getResource(sPath);
if (url == null)
System.out.println("Class.getResource(" + sPath + "): NULL");
else
System.out.println("Class.getResource(" + sPath + "): SUCCESS");
}
}
Here's the corresponding directory tree. It happens to be an Eclipse project, but the directories are the same regardless if it's Eclipse, Netbeans ... or a .jar file:
C:.
├───.settings
├───bin
│ ├───com
│ │ └───so
│ │ └───resourcetest
│ └───subdir
└───src
├───com
│ └───so
│ └───resourcetest
└───subdir
The file being opened is "subdir/readme.txt"
ADDENDUM 11/9/12:
Hi -
I copied your code verbatim from github, re-compiled and re-ran:
ClassLoader.getResource(/subdir/readme.txt): NULL
Class.getResource(/subdir/readme.txt): SUCCESS
ClassLoader.getResource(subdir/readme.txt): SUCCESS
Class.getResource(subdir/readme.txt): NULL
If that's not the output you're getting ... I'm baffled.
For whatever it's worth, I'm running:
Eclipse Indigo (it shouldn't matter)
Running inside the IDE (it shouldn't matter if it's filesystem or .jar, inside or outside an IDE)
My JRE is 1.6 (if anything, this is probably the biggie)
Sorry we haven't been able to resolve what I thought was a straightforward issue :(
ADDENDUM 11/21/12 (Andreas):
Since there was no recent activity on this question, I would like to summarize what we found:
Class.getResource("/path/image.png")
returns a valid URL, while ClassLoader.getResource("path/image.png")
returns null":