我有一个使用驻留在TOMCAT_HOME / common / lib中的库的Web应用程序。此库在类路径的根(在名为ApplicationConfig的类中)中查找属性文件:
ApplicationConfig.class.getResourceAsStream("/hv-application.properties");
我的Tomcat Web应用程序包含此属性文件。它在WEB-INF / classes中,它是classpath的根本吗?但是,在运行时,当它尝试加载属性文件时,它会抛出异常,因为它无法找到它(getResourceAsStream返回null)。
如果我的应用程序是一个简单的独立Java应用程序,那么一切正常。 Tomcat会导致getResourceAsStream方法采取不同的行为吗?我知道那里有很多类似的问题,但不幸的是他们都没有帮助过。感谢。
答案 0 :(得分:23)
请尝试Thread.currentThread().getContextClassLoader().getResourceAsStream("/hv-application.properties")
。
答案 1 :(得分:2)
这看起来可能与Tomcat类加载器的工作方式有关。如果你在一个类加载器(webapp类加载器中的配置文件)中有一些东西被另一个(jar in common / lib)中的东西使用,结果可能会非常令人头疼。
这个document解释了Tomcat如何委托给类加载器。如果可能,您可以尝试以下其中一项:
无论哪种方式,在不同的类加载器中拥有资源可能会很痛苦。我希望这会有所帮助。
(*)log4j具有-log4j.ignoreTCL
选项,但这可以实现
答案 2 :(得分:1)
Tomcat安全管理器通常不允许您从Tomcat根库中的库访问webapp类和资源。这是为了在容器中运行的Web应用程序之间进行分离。
您应该能够通过更新安全策略来解决这个问题,但通常最好不要将您的lib放入Tomcat容器中,我假设您正在这样做。
答案 3 :(得分:0)
我正在扩展Olivier comment作为回应(感谢您的领导)。
问题似乎是资源路径中的前导斜杠(/)。
在 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");
已正确解析。