Read Classpath Resource from Jar Files with Spring

To read resources from classpath, you can use the Spring class ClassPathResource. The constructor with one argument reads only resources from file system.  But sometimes you want to read a resources from a jar file in the classpath.  For this case, you must build an own URLClassLoader from the URL of the jar file and use the ClassPathResource constructor with the arguments path and classLoader.  The path value is the path of the resource in the jar file.

An Example

We have a jar file, named example.jar. The content looks as follows:

1example.jar
2  |_ META-INF
3     |_ sample-resource.txt

We want to read the sample-resource.txt.  The source code for this example looks as follows:

1URL jarUrl = new File("path_to_jar_file").toURI().toURL();
2URLClassLoader jarLoader = new URLClassLoader(new URL[]{jarUrl}, Thread.currentThread().getContextClassLoader());
3ClassPathResource sampleResource = new ClassPathResource("META-INF/sample-resource.txt",jarLoader);