【问题标题】:Loading files in JAR in Tomcat using getResourceAsStream使用 getResourceAsStream 在 Tomcat 中加载 JAR 中的文件
【发布时间】:2011-10-16 17:22:16
【问题描述】:

有没有办法使用 getResourceAsStream 从 Tomcat 应用程序加载存储在 JAR 中的文件?

我有一个库,可以将它需要的所有文件连同编译的类一起放入它的 jar 中。该代码在独立应用程序中使用该库时有效,但在 Tomcat 内部使用该库时无效(使用 PHP java-bridge)。

final InputStream stream = Object.class.getResourceAsStream("/styles/foo.xsl");

我尝试没有成功使用问题getResourceAsStream not loading resource in webapp中概述的解决方案并将代码更改为

final ClassLoader resourceLoader = Thread.currentThread().getContextClassLoader();
final InputStream stream = resourceLoader.getResourceAsStream("/styles/foo.xsl");

当库单独使用或在 Tomcat 中使用库时,后面的代码都不起作用。在这两种情况下stream == null

我尝试加载的文件已正确存储在 /styles/foo.xsl 的 JAR 中。包含所有类和这些其他文件的 JAR 是 tomcat/webapps/iJavaBridge/WEB-INF/lib/

有人能推荐一段在 Tomcat 和非 Tomcat 应用程序中都有效的代码吗?

【问题讨论】:

  • sitepoint.com/forums/… 建议使用<Context path="/app" antiJARLocking="true"/>。我应该向 Tomcat 管理员建议此更改吗?

标签: java jakarta-ee tomcat


【解决方案1】:

您需要从路径中删除前导斜杠。这仅适用于不在类路径根目录上运行的类加载器。

final ClassLoader resourceLoader = Thread.currentThread().getContextClassLoader();
final InputStream stream = resourceLoader.getResourceAsStream("styles/foo.xsl");

【讨论】:

  • 谢谢,效果很好。您能否详细说明“不在类路径根目录上运行的类加载器”是什么意思?
  • 您从某个类获得的类加载器(就像您最初所做的那样)相对于 那个 类的位置进行操作,并且可以采用相对路径或以 @987654322 开头的路径@.
【解决方案2】:

如果您在带有 xsl 的 jar 中有一个类文件,请尝试以下操作: final ClassLoader resourceLoader = com.mypackage.MyClassInJar.class.getClassloader(); 最终 InputStream 流 = resourceLoader.getResourceAsStream("/styles/foo.xsl");

如果没有类,就创建一个虚拟类。

我认为这应该可行,因为您将始终让类加载器负责 jar。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-24
    • 2013-11-16
    • 2014-03-23
    • 2018-03-19
    • 2012-10-08
    • 1970-01-01
    • 2015-08-22
    • 2010-09-24
    相关资源
    最近更新 更多