我需要从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中的资源?
谢谢&问候, 阿米特帕特尔
答案 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项目,其结构如下所示
现在我建立这个项目;罐子看起来像
此处 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中的一个类,您刚刚将其包含在构建路径中。