Tomcat 7 到 8.5 升级:getResourceAsStream 抛出 NPE

Tomcat 7 to 8.5 upgrade : getResourceAsStream throws NPE

我是这个 Dev Ops 工作的新手,所以请原谅我可能忽略的任何简单内容。我正在从 Tomcat 7 升级到 8.5。除了 apache 网站和使用 7 to 8 then the 8 to 8.5 之外,没有太多关于迁移手册的内容。一切似乎都很好,期待当我启动应用程序并且代码尝试使用以下

加载信息
Thread.currentThread().getContextClassLoader().getResourceAsStream("sql/");

getClass().getClassLoader().getResourceAsStream("sql/");

正在使用 ROOT.xml 加载上下文路径,它有一个 docBase 指向位于 ../tomcat/databaseLink 目录中的项目。 WEB-INF/classes文件夹在../tomcat/databaseLink目录下,sql文件夹在WEB-INF/classes文件夹下。所以一切似乎都还好。

当代码为 运行 时,它看起来像是在 ../tomcat/lib/ 目录而不是 ../tomcat/databaseLink/WEB-INF/classes/sql/ 目录中寻找 sql 文件夹。我没有对默认的 Tomcat 8 conf 文件进行任何更改。知道为什么会这样或者我错过了什么吗?

方法 ClassLoader#getResourceAsStream 只查找 Web 应用程序类路径上的资源,即:

  • 在文件夹 WEB-INF/classes 中或在 WEB-INF/lib 文件夹内的 JAR 文件中,
  • 在 Tomcat 的 SharedCommonSystemBootstrap 类加载器的类路径中(参见 Tomcat documentation)。正如您所注意到的,默认情况下 Common 类加载器在其类路径中具有目录 $CATALINA_HOME/lib$CATALINA_BASE/lib

您正在寻找的方法是 ServletContext#getResourceAsStream,它在应用程序目录和 WEB-INF/lib 中所有 JAR 的 META-INF/resources 条目中搜索。所以你应该调用:

servletContext.getResourceAsStream("/WEB-INF/sql/your_file");