【问题标题】:Accessing a folder from ClassLoader从 ClassLoader 访问文件夹
【发布时间】:2017-12-08 14:06:42
【问题描述】:

我有一个 JAVA EE 应用程序。采用这种结构:

/iberiaApp
/iberiaApp/configFiles/hotel
/iberiaApp/config.jsp
/iberiaApp/WEB-INF/classes

config.jsp里面我有这段代码:

 <%=FileReader.readFiles("configFiles/hotel")%>;

public static List<String> readFiles (String folder) throws URISyntaxException {

    ClassLoader classLoader = FileReader.class.getClassLoader();

    URI uri = classLoader.getResource(folder).toURI();

但我有一个获取 URI 的空指针(classLoader.getResource(folder) 返回空值)

【问题讨论】:

  • 首先,尝试分别调用方法,找出哪个方法返回null。看那行可能classLoader.getResource(folder) 正在返回null。类加载器正在寻找来自 /iberiaApp/WEB-INF/classes 的资源。

标签: java jsp jakarta-ee


【解决方案1】:

看看这些笔记来自: https://stackoverflow.com/a/3160706/1715121

几点说明:

  1. 您应该更喜欢 [Thread#getContextClassLoader()][1] 返回的 ClassLoader

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    

    这将返回可以访问所有资源的最父类加载器。 Class#getClassLoader() 只会返回相关类的(子)类加载器,它本身可能无法访问所需的资源。它总是在具有单个类加载器的环境中工作,但并不总是在具有复杂的类加载器层次结构的环境中,如 webapps。

  2. /WEB-INF 文件夹不在类路径的根目录中。 /WEB-INF/classes 文件夹是。所以你需要加载相关的属性文件。

    classLoader.getResource("/configFiles/hotel");
    

【讨论】:

  • 两点都不正确。他应该使用的唯一 ClassLoader 是与执行加载的类相对应的 ClassLoader。并且 ClassLoader.getResource always 需要一个没有前导斜杠的字符串。
【解决方案2】:

Web 应用根目录本身不在运行时类路径中,因此您无法通过类加载器加载相对于 Web 应用根目录的资源。将配置文件放在 src/main/resources 下,这样在运行时它们将位于 WEB-INF/classes 下,并且可以通过类加载访问。

此外,您也不希望将配置文件保留在网络应用根目录下,因为这样网络应用用户就可以直接访问它们。

【讨论】:

  • 你假设他正在使用 maven 结构。请把它写在你的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多