如何从文件加载资源包,而不是从 jar,相同的包基名
How to load resource bundle from file, not from jar, same bundle base name
文件系统和jar 中都存在具有相同基本名称的资源包。
尝试从文件系统而不是 jar 加载资源包。
URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{filePathURL});
ResourceBundle bundle = ResourceBundle.getBundle( "my.bundle", locale, urlLoader );
包是从 jar 加载的,而不是从文件系统加载的。为什么?
如果我将捆绑包基本名称更改为 my.foo.bundle(与 jar 中的捆绑包名称不同),它就会起作用。但是文件系统和 jar 中的包名称是相同的。有办法吗?
谢谢。
我认为这是因为 URLClassLoader 加载资源的方式。
如果是 URLClassLoader:
每当请求资源时,它首先要求父 class-loader 加载它。如果该资源不可用,它会检查子 class 加载器。
不确定这是否是最好的方法,但可能的解决方案:
1.使用构造函数
`public URLClassLoader(URL[] urls, ClassLoader parent)`
并为父级提供 null
像这样:
URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{filePathURL}, null);
ResourceBundle bundle = ResourceBundle.getBundle( "my.bundle", locale, urlLoader );
2. 扩展 URLClassLoader 并覆盖方法 getResource
方法以首先从您的 class 加载器加载:
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;
}
文件系统和jar 中都存在具有相同基本名称的资源包。 尝试从文件系统而不是 jar 加载资源包。
URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{filePathURL});
ResourceBundle bundle = ResourceBundle.getBundle( "my.bundle", locale, urlLoader );
包是从 jar 加载的,而不是从文件系统加载的。为什么? 如果我将捆绑包基本名称更改为 my.foo.bundle(与 jar 中的捆绑包名称不同),它就会起作用。但是文件系统和 jar 中的包名称是相同的。有办法吗?
谢谢。
我认为这是因为 URLClassLoader 加载资源的方式。
如果是 URLClassLoader:
每当请求资源时,它首先要求父 class-loader 加载它。如果该资源不可用,它会检查子 class 加载器。
不确定这是否是最好的方法,但可能的解决方案:
1.使用构造函数
`public URLClassLoader(URL[] urls, ClassLoader parent)`
并为父级提供 null
像这样:
URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{filePathURL}, null);
ResourceBundle bundle = ResourceBundle.getBundle( "my.bundle", locale, urlLoader );
2. 扩展 URLClassLoader 并覆盖方法 getResource
方法以首先从您的 class 加载器加载:
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;
}