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 的
Shared
、Common
、System
或 Bootstrap
类加载器的类路径中(参见 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");
我是这个 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 的
Shared
、Common
、System
或Bootstrap
类加载器的类路径中(参见 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");