如何从打包在war文件中的jar文件加载资源?

2022-09-02 23:22:36

我需要从jar中加载一个属性文件。该罐子包含在战争文件中。这是结构

ROOT.war
  WEB-INF
     lib
       my.jar

here my.jar has following structure

my.jar
  com
    test
      myservlet.class
  WEB-INF
    test.property

现在我已经在我的一个 servlet 中编写了以下代码,如下所示:

InputStream stream = getServletContext().getResourceAsStream("/WEB-INF/test.properties");
Properties prop = new Properties();
prop.load(stream );

但是上面的代码我得到了流为空。如果我把属性文件放在ROOT.war/WEB-INF中,它工作正常。我有一个公平的想法,如果getResourceAsStream中的路径以'/'开头,那么它在上下文根目录中搜索资源。但是我怎么能阅读位于jar中的资源,该jar再次在ROOT应用程序的WEB-INF / lib中找到?

感谢和问候,阿米特·帕特尔


答案 1

把它放在JAR的根中,并通过上下文类加载器而不是servletcontext获取它。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("test.properties");
// ...

文件夹约定特定于 WAR 文件,而不是 JAR 文件。摆脱它。如果您确实需要一个单独的 JAR 文件夹,该文件夹要作为类路径的一部分,请改用。/WEB-INF/META-INF

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("META-INF/test.properties");
// ...

答案 2

您可以从给定实例访问标准类路径上的任何资源

this.getClass().getResourceAsStream("name");

例如,来自您的“myservlet”类(命名错误)。

getServletContext().getResourceAsStream()访问 Web 应用程序基目录上下文中的内容。

在jar中包含WEB-INF目录似乎很糟糕 - 你会引起混淆。你找不到更好的名字吗?


推荐