Search code examples
javaresourcebundleurlclassloader

How to load resource bundle from file, not from jar, same bundle base name


There are resource bundles with the same base name in both file system and jar. Try to load the resource bundle from file system, not from jar.

URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{filePathURL});
ResourceBundle bundle = ResourceBundle.getBundle( "my.bundle", locale, urlLoader );

The bundle is loaded from jar, not from the file system. Why? If I changed the bundle base name to my.foo.bundle(different from the bundle name in jar), it worked. But the bundle names are the same for file system and in jar. Is there a way?

Thanks.


Solution

  • I believe that it is because of the way URLClassLoader loads resources.

    In case of URLClassLoader:
    Whenever a resource is requested, it first asks the parent class-loader to load it. If that resource is not available it then checks the child class loaders.


    Not sure whether this is the best way but, possible solutions:

    1. Use the constructor

    `public URLClassLoader(URL[] urls, ClassLoader parent)`
    

    And give null for parent

    Like so:

    URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{filePathURL}, null);
    ResourceBundle bundle = ResourceBundle.getBundle( "my.bundle", locale, urlLoader );
    

    2. Extend the URLClassLoader and override the method getResource method to load from your class loader first:


    public URL getResource(String name) {
        URL url = findResource(name); // this will load from your class loader
        if (url == null) {
            if (parent != null) {
                url = parent.getResource(name);
            } else {
                url = getBootstrapResource(name);
            }
        }
    
        return url;
    }