首页 文章

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

提问于
浏览
13

这个问题在这里已有答案:

我需要从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 回答

  • 2

    将它放在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");
    // ...
    
  • 36

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

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

    例如来自你的“myservlet”类(Bad命名) .

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

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

  • 6

    这是我发现的,它对我有用 . @BalusC提供的帮助对我有用 . 我已经整理了我发现的内容,以及我如何验证它是否正常工作 .

    我有一个具有以下结构的maven项目,如下所示

    project structure

    现在我 Build 这个项目; jar 看起来像

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

    How did I verified

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

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

    其中 Queries 是jar中刚刚包含在构建路径中的类 .

相关问题