这个问题在这里已有答案:
我需要从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 回答
将它放在JAR的根目录中,并通过上下文类加载器而不是servletcontext来获取它 .
/WEB-INF
文件夹约定特定于WAR文件,而不是JAR文件 . 摆脱它 . 如果您确实需要一个单独的JAR文件夹作为类路径的一部分,请改用/META-INF
.您可以从给定实例访问标准类路径上的任何资源
例如来自你的“myservlet”类(Bad命名) .
getServletContext().getResourceAsStream()
访问Web应用程序基目录上下文中的内容 .在jar中加入WEB-INF目录似乎很糟糕 - 你会引起混淆 . 你能找到更好的名字吗?
这是我发现的,它对我有用 . @BalusC提供的帮助对我有用 . 我已经整理了我发现的内容,以及我如何验证它是否正常工作 .
我有一个具有以下结构的maven项目,如下所示
现在我 Build 这个项目; jar 看起来像
这里 queries.properties 在"META-INF"文件夹下移动 . 现在,如果这个jar有一个类,它试图使用
Thread.currentThread().getContextClassLoader().getResourceAsStream("queries.properties")
来利用这个属性文件认为仍然可以在资源文件夹下访问同一个文件,如项目结构所示,这是错误的 . 正确的方法是通过META-INF文件夹访问
How did I verified
只需创建一个简单的java项目,并将刚刚创建的jar包含到其构建路径中,并创建一个类的实例,该类具有如上所述的ClassLoader语句 . 你在这个新的java项目中的代码应该是这样的
其中
Queries
是jar中刚刚包含在构建路径中的类 .