繁体   English   中英

getResourceAsStream没有在webapp中加载资源

[英]getResourceAsStream not loading resource in webapp

我有一个Web应用程序,它使用驻留在TOMCAT_HOME / common / lib中的库。 此库在类路径的根(在名为ApplicationConfig的类中)中查找属性文件:

ApplicationConfig.class.getResourceAsStream("/hv-application.properties");

我的Tomcat Web应用程序包含此属性文件。 它在WEB-INF / classes中,它是classpath的根本吗? 但是,在运行时,当它尝试加载属性文件时,它会抛出异常,因为它无法找到它(getResourceAsStream返回null)。

如果我的应用程序是一个简单的独立Java应用程序,那么一切正常。 Tomcat会导致getResourceAsStream方法采取不同的行为吗? 我知道那里有很多类似的问题,但不幸的是他们都没有帮助过。 谢谢。

请尝试使用Thread.currentThread().getContextClassLoader().getResourceAsStream("/hv-application.properties")

这看起来可能与Tomcat类加载器的工作方式有关。 如果你在一个类加载器(webapp类加载器中的配置文件)中有某些东西被另一个(jar in common / lib)中的东西使用,那么结果可能会非常令人头疼。

文档解释了Tomcat如何委托给类加载器。 如果可能,您可以尝试以下之一:

  1. 将common / lib中的jar文件移动到Web应用程序(WEB-INF / lib)中。 我知道这并不总是可行的,但有时jars(例如log4j)可以跨类加载器(*)和平共存。
  2. 将配置文件移动到common / classes中。 这实际上是相同的(将配置项放入与需要它的jar相同的类加载器中)。 同样,这并不理想,但如果你能控制你的环境,那就行了。

无论哪种方式,在不同的类加载器中拥有资源可能会很痛苦。 我希望这有帮助。

(*)log4j具有-log4j.ignoreTCL选项,这使得这成为可能

Tomcat安全管理器通常不允许您从Tomcat根库中的库访问webapp类和资源。 这是为了在容器中运行的Web应用程序之间进行分离。

您应该可以通过更新安全策略来解决这个问题,但通常最好不要将您的lib放入Tomcat容器中,我假设您正在这样做。

我正在扩大奥利维尔的评论作为回应(谢谢你的领导)。

问题似乎是资源路径中的前导斜杠(/)。

Tomcat 8中 ,WebAppClassloader正确地解析了带有和不带前导斜杠的路径。 两个.getResourceAsStream("/org/pakopa/app/config.properties"); .getResourceAsStream("org/pakopa/app/config.properties"); 返回一个InputStream。

Tomcat 7中 (我也假设以前的版本) .getResourceAsStream("/org/pakopa/app/config.properties"); 没有解析并返回null但是.getResourceAsStream("org/pakopa/app/config.properties"); 正确解决了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM