0

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.

eastwater
  • 4,624
  • 9
  • 49
  • 118

1 Answers1

1

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;
}
MJSG
  • 1,035
  • 8
  • 12