Search code examples
javaclassloader

ClassLoader loading wrong file


I use this code snippet to obtain a file as an input stream. The file version.txt is packaged in my app's jar, in the upper-most folder.

InputStream resource = getClass().getClassLoader().getResourceAsStream("version.txt");

This works almost all of the time. But for one user, it's picking up another version.txt, that's not in my jar. How can I ensure that this loads the specific version.txt file that is in my jar?


Solution

  • When you say, "upper-most folder", you mean the default package? If that's the case, you would have to ensure your JAR is earlier on the classpath than whatever is contributing the other version.txt file as Java searches along the classpath until it finds the first match.

    Since it's hard to ensure your JAR would always be first, you should really place the version.txt file in a non-default package, such as:

    com.yourcompany.yourproject.version
    

    And then you'd need to modify the code to locate it:

    Stream resource = getClass().getClassLoader().getResourceAsStream("com/yourcompany/yourproject/version/version.txt");
    

    Using the default package is an anti-pattern.