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

时间:2011-01-03 15:06:20

标签: java servlets

我需要从jar加载属性文件。 jar包含在war文件中。这是结构

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 );

但是上面的代码我得到了流为null。如果我将属性文件放在ROOT.war / WEB-INF中,它可以正常工作。我很清楚,如果getResourceAsStream中的路径以'/'开头,而不是上下文根中的搜索资源。但是如何读取位于根应用程序的WEB-INF / lib中的jar中的资源?

谢谢&问候, 阿米特帕特尔

3 个答案:

答案 0 :(得分:37)

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

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

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

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

答案 1 :(得分:6)

您可以从给定实例

访问标准类路径上的任何资源
this.getClass().getResourceAsStream("name");

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

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

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

答案 2 :(得分:2)

这是我发现的,它对我有用。 @BalusC提供的帮助对我有用。我已经整理了我发现的内容以及我如何确认它的工作原理。

我有一个maven项目,其结构如下所示

project structure

现在我建立这个项目;罐子看起来像

enter image description here

此处 queries.properties 移动到“META-INF”文件夹下。现在,如果这个jar有一个试图利用这个属性文件的类 Thread.currentThread().getContextClassLoader().getResourceAsStream("queries.properties")

认为仍然可以在资源文件夹下访问同一个文件,如项目结构所示,这是错误的。正确的方法是通过META-INF文件夹访问

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

我是如何验证的

只需创建一个简单的java项目,并将刚刚创建的jar包含到其构建路径中,并创建一个类的实例,该类具有如上所述的ClassLoader语句。您在这个新的Java项目中的代码应该看起来像

public static void main(String[] args){
        new Queries();
    }

其中Queries是jar中的一个类,您刚刚将其包含在构建路径中。