Home > Net >  Java ClassLoader.getResourceAsStream(path) return null when resource is inside nested jar
Java ClassLoader.getResourceAsStream(path) return null when resource is inside nested jar

Time:04-03

My springboot project (project A) has dependency to library (library B) which is jar file (it's also my project, but source code is not present during compilation project A). Inside jar I have directory dir1 with one file file2.

Project structure:

- project A
-- src/main/java/com/test/ResourcesUtils.java
-- src/main/resources/dir1/file1

- library B
-- src/main/resources/dir1/file2

When I try to get resource from project A everything works fine for example:

InputStream is1 = ResourcesUtils.class.getClassLoader().getResourceAsStream("dir1\\file1);
InputStream is2 = ResourcesUtils.class.getClassLoader().getResourceAsStream("dir1/file1);

Both (is1, is2) are not null.

When I try to get resource from library B using the same method it does not work

InputStream is1 = ResourcesUtils.class.getClassLoader().getResourceAsStream("dir1\\file2);
InputStream is2 = ResourcesUtils.class.getClassLoader().getResourceAsStream("dir1/file2);

Variable is1 is null, is2 is not null.

Am I doing something wrong? Why it works different for resource from main jar than from dependent jar?

I can't just switch to second version (with '/', because I'm not controlling string which is passed to getResourceAsStream)

public static boolean existsInResource(Path path) {

try (InputStream is = ResourcesUtils.class.getClassLoader().getResourceAsStream(path.toString())) {
      return is != null;
    } catch (final IOException e) {
      // handle exception
    }
  }

CodePudding user response:

When referring to file1, it is a physical file in your application, and I assume that you run your code on Windows. The file file1 is in the Windows file system.

When referring to file2, it is inside a JAR file. That is not a windows file system, it is a JAR file.

Unless you know that the file is a physical file, it is safer to use the forward slash. The \ is a residue from the old 32-bit windows before Windows NT. Windows NT inside (I am not sure if I remember it correctly) uses /, and the command processor only uses the \.

  • Related