2

properties使用位于root directory我的 Web 应用程序的 Glassfishv3 网络服务器读取 JSF2.0 中的文件,我使用以下代码 -

    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 域中不存在该文件。

有没有什么方法可以读取在开发阶段和战争文件中都可以工作的属性文件?

4

1 回答 1

9

您永远不应该使用java.io.File来引用网络资源。它对它所处的上下文一无所知。您也不应该使用它,因为当服务器配置为在内存中而不是在磁盘上扩展 WAR 文件时ServletContext#getRealPath(),它可能会返回,这超出了您在 3rd 方主机中的控制范围。null

只需使用ExternalContext#getResourceAsStream()InputStream. 它采用相对于 webcontent 根目录的路径。

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"));

(请注意,路径可能不以斜杠开头!)

于 2013-04-12T13:22:06.163 回答