Wildfly VFS - URLClassLoader无法加载属性文件

时间:2018-04-10 19:31:24

标签: java wildfly urlclassloader

我们在Wildfly上遇到了奇怪的问题(虽然它也发生在Tomcat上)。 在新的战争部署之后,我能够找到资源包文件,但是在执行了一些代码(不确定是什么)之后,wildfly无法使用URLClassLoader加载ResourceBundle文件。看起来像ClassLoader问题但不确定。 我们怎样才能找出它的罪魁祸首? 以下是用于获取ResourceBundle的代码:

Locale locale = Locale.getDefault();
java.io.File fileObj = new java.io.File(bundleName);
java.net.URL resourceURL = null;

try {
    resourceURL = fileObj.getParentFile().toURI().toURL();
} catch (MalformedURLException e) {
    e.printStackTrace();
}

URLClassLoader urlLoader = new URLClassLoader(
    new java.net.URL[] {
        resourceURL
});
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle(
bundleName.substring(
bundleName.lastIndexOf(File.separator) + 1,
bundleName.lastIndexOf(".")), locale, urlLoader);
try {
    msg = bundle.getString(bundleMsg);
} catch (Exception e) {
    e.printStackTrace();
}
return msg;

1 个答案:

答案 0 :(得分:0)

您无法通过java.io.File对象在WAR或JAR文件中引用任何对象。 WAR和JAR不包含“文件”。

此外,如果结构符合您的要求:

WAR
  WEB-INF
  query
      resource_bundle

然后你不能将它作为类加载器资源访问。

您必须使用javax.servlet.ServletContext.getResource(String path)javax.servlet.ServletContext.getResourceAsStream(String path)来访问此位置的资源。

只能通过类加载器访问WEB-INF / classes目录中的对象。

鉴于这些资源的性质,我认为你可能真的想要它们在WEB-INF / classes下。如何执行此操作取决于您构建Web应用程序的方式。如果您使用的是Maven,那么正确的源位置将为src/main/resources/query/resource_bundle。然后你可以使用:

 this.getClass().getResourceAsStream("/query/resource_bundle/" + bundleName);

如果我已经解释了你正在尝试做的事情。