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

我需要从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中的资源?

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

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

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

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

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

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

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

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

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

项目结构

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

在此处输入图像描述

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

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

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

我是如何validation的

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

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

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