Java:如何在war包内访问属性文件

12
我已经在StackOverflow上搜索了“war包内的属性”,但是没有一个结果适用于我的情况。
我正在使用Eclipse Galileo和GlassFish v3开发一组Web服务。 我正在使用“动态Web项目”,具有以下结构。
Src
-java_code_pkg_1
-java_code_pkg_2
-com.company.config
--configfile.properties WebContent
-META-INF
-WEB-INF
--log4jProperties
--web.xml
--applicationContext.xml
--app-servlet.xml

我想访问“java_code_pkg1”中的一个源文件里的“configfile.properties”。我正在使用Spring框架,这个文件将在应用程序在服务器上启动时被实例化。
我尝试过以下方法,但没有成功。
getResourceAsStream("/com.company.config/configfile.properties");
getResourceAsStream("/com/company/config/configfile.properties");
getResourceAsStream("com/company/config/configfile.properties");
getResourceAsStream("/configfile.properties");
getResourceAsStream("configfile.properties");

getResourceBundle(..) didn't work either.

当文件不在WEB-INF/classes路径下时,是否可能访问该文件?如果可以,如何操作?

6个回答

11
Properties props = new Properties();
props.load(this.getClass().getResourceAsStream("/com/company/config/file.properties"));

在调试模式下可以正常工作。我可以在调试器中看到值,但是在执行“props.load”行之后、进入下面的代码块之前就会出现NullPointerException异常。

那是一个不同的问题。至少现在我知道这是访问配置文件的方法。

感谢您的帮助。


7
如果你在进行一项任务时,你的类路径“当前目录”是“WEB-INF/classes”。只需向上移动两个级别即可。
getResourceAsStream("../../com/company/config/configfile.properties");

虽然不太好看,但它确实有效。至少,在tomcat、jboss和geronimo下它是有效的,而且它在今天依然有效。

附注:你的目录结构不是很清晰。也许应该是:

getResourceAsStream("../../com.company.config/configfile.properties");

感谢您的技巧。它很好地解决了在包含ear文件中加载属性文件的问题。有没有建议可以加载位于兄弟war文件中且名称不确定的属性文件? - Snekse
嗯,我想你不能这样做。应用服务器应该将每个war文件隔离开来,并且不应该让你访问兄弟war文件中的文件。显然,有绕过或放宽AS安全策略的方法,但它们是依赖于AS的。 - andcoz

3

检查WAR文件中属性文件的位置。如果它位于com / company / config目录下的WEB-INF / classes目录中,则 getResourceAsStream(“com / company / config / configfile.properties”)应该可以工作,或者 getResourceAsStream(“/ com / company / config / configfile.properties”)。如果配置文件不在WEB-INF / classes目录下,则应该这样做。

另外尝试使用getClass()。getClassLoader()。getResourceAsStream。


1

你确定这个文件被包含在你的war文件中吗?很多时候,war构建过程会过滤掉非.class文件。


是的,文件在那里。如果我浏览Glassfish目录结构,我就能看到它。 - del.ave

0

既然您正在使用Spring,则可以使用Spring中的资源支持直接注入属性文件。

请参见http://static.springsource.org/spring/docs/3.0.x/reference/resources.html

即使需要属性文件的类不是由Spring管理,您仍然可以访问ApplicationContext并使用它来加载资源。

资源可能是类似于classpath:settings.properties的东西,假设您的属性文件已被构建拾取并放入war文件中。

您还可以直接注入,如文档所述:

<property name="template" value="classpath:some/resource/path/myTemplate.txt">

0

一旦部署到服务器上,路径是什么?可以使用Scanner手动读取资源。从包内的Java文件中,创建一个新文件("../applications/")将使您获得指向{glassfish install}\domains\{domain name}\applications的文件。也许您可以更改该文件路径以指导您前往所需位置?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接