Java getResourceAsStream未在webapp中加载资源

Java getResourceAsStream未在webapp中加载资源,java,tomcat,jakarta-ee,Java,Tomcat,Jakarta Ee,我有一个web应用程序,它使用驻留在TOMCAT_HOME/common/lib中的库。此库在类路径的根目录下查找属性文件(在名为ApplicationConfig的类中): 我的Tomcat web应用程序包含此属性文件。它位于WEB-INF/classes中,哪个是类路径的根,对吗?但是,在运行时,当它尝试加载属性文件时,会抛出一个异常,因为它找不到它(getResourceAsStream返回null) 如果我的应用程序是一个简单、独立的Java应用程序,那么一切都可以正常工作。Tomca

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

我的Tomcat web应用程序包含此属性文件。它位于WEB-INF/classes中,哪个是类路径的根,对吗?但是,在运行时,当它尝试加载属性文件时,会抛出一个异常,因为它找不到它(getResourceAsStream返回null)


如果我的应用程序是一个简单、独立的Java应用程序,那么一切都可以正常工作。Tomcat是否导致getResourceAsStream方法的行为不同?我知道有很多类似的问题,但不幸的是,没有一个能帮上忙。谢谢。

请尝试
Thread.currentThread().getContextClassLoader().getResourceAsStream(“/hv application.properties”)

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


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

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

这解释了Tomcat如何委托给类装入器。如果可能,您可以尝试以下方法之一:

  • 将common/lib中的jar文件移动到web应用程序(web-INF/lib)中。我知道这并不总是可能的,但有时JAR(例如log4j)可以在类加载器(*)之间和平共存
  • 将配置文件移动到公共/类中。这实际上是同一件事(将配置项与需要它的jar放在同一个类加载器中)。同样,这并不理想,但如果您能够控制您的环境,它将起作用
  • 无论哪种方式,在不同的类加载器中拥有资源都是一件痛苦的事情。我希望这有帮助

    (*)log4j有
    -log4j.ignoreTCL
    选项,这使得这成为可能,尽管我正在扩展作为回应(感谢您的引导)

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

    Tomcat 8中,WebAppClassloader正确解析带或不带前导斜杠的路径。两者都
    .getResourceAsStream(“/org/pakopa/app/config.properties”)
    .getResourceAsStream(“org/pakopa/app/config.properties”)返回一个InputStream


    Tomcat7(我也假设以前的版本)
    .getResourceAsStream(“/org/pakopa/app/config.properties”)
    未解析,返回
    null
    .getResourceAsStream(“org/pakopa/app/config.properties”)已正确解析。

    问题清楚地表明资源位于WEB-INF/classes目录中…@stevedbrown,OP表示该文件与WAR一起打包在WEB-INF/classes中。您读了第一句吗?“我有一个web应用程序,它使用驻留在TOMCAT_HOME/common/lib中的库。该库在类路径的根目录下(在名为ApplicationConfig的类中)查找属性文件:”我的同胞!你的争吵伤了我的耳朵!资源在webapp中,但需要访问资源的是库。@stevedbrown,我很困惑-如果Tomcat根库中的库无法在已部署的webapp中定位类,容器如何加载servlet?谢谢binil。这是可行的,但我不想对库做任何更改。如果找不到其他解决方案,将标记为应答。奇怪的是,在带有Win XP的Tomcat 5.5和JDK 1.5.08下,我能够加载资源文件而不使用前导“/”。实际上,在准备“/”时,我遇到了问题。谢谢Andy,我尝试将配置文件移动到common/类中,但没有成功。我的webapp是唯一一个使用这个库的webapp,所以也许我会将它移到WEB-INF/lib中(虽然这会有点痛苦,因为我必须修改我的Maven pom,使它包含JAR)。最好将所有JAR都保留在你的webapp中。大多数情况下,这是可能的,但在某些情况下,将内容移动到common/lib(例如,如果您正在创建一个旨在跨服务器可用的资源)。
    ApplicationConfig.class.getResourceAsStream("/hv-application.properties");