要使用Glassfishv3 webserver(位于我的Web应用程序的properties
)阅读JSF2.0中的root directory
文件,我使用下面的代码 -
ServletContext ctx = (ServletContext) FacesContext
.getCurrentInstance().getExternalContext().getContext();
String deploymentDirectoryPath = ctx.getRealPath("/");
Properties prop = new Properties();
prop.load(new FileInputStream(deploymentDirectoryPath
+ File.separator + "portal-config.properties"));
以下是门户网站的屏幕截图 -
在运行门户网站时,我收到FileNotFound错误,因为该文件在glassfish域中不存在。
有没有办法读取属性文件,它既适用于情境,也适用于开发阶段和war文件?
答案 0 :(得分:9)
您绝不应该使用java.io.File
来引用网络资源。它对它所处的上下文一无所知。当服务器配置为在内存而不是磁盘上扩展WAR文件时,你也不应该使用ServletContext#getRealPath()
,因为它可能会返回null
,这超出了你的范围。在第三方主机中控制。
只需使用ExternalContext#getResourceAsStream()
直接获取InputStream
的网络资源即可。它需要一个相对于webcontent root的路径。
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
properties.load(ec.getResourceAsStream("/portal-config.properties"));
更新它似乎根本不是网络资源。您应该将文件移动到“WebContent”文件夹中,如屏幕截图所示。或者,更好的是,/WEB-INF
文件夹,以便任何人都无法通过URL访问它。
properties.load(ec.getResourceAsStream("/WEB-INF/portal-config.properties"));
另一种方法是将其放在类路径中,即“Java源”文件夹,如屏幕截图所示。您不需要将它放在一个包中,这是可选的。假设你没有将它放在一个包中,那么这样做:
ClassLoader cl = Thread.currentThread().getContextClassLoader();
properties.load(cl.getResourceAsStream("portal-config.properties"));
(请注意,路径可能不会以斜杠开头!)