在Web应用程序中使用属性文件

时间:2015-06-12 05:51:47

标签: jsf properties-file web-inf

我正在开发一个Web应用程序(这是我的第一次)并且对使用属性文件非常困惑。我不知道在哪里放属性文件。

问题是我把它放在WEB_INF文件夹下。当我测试它作为Java应用程序运行以检查数据库连接是否根据属性文件中的属性工作时它正在运行没有任何问题。

但是当我在服务器中作为Web应用程序运行时,它无法加载属性文件,说它无法在指定的路径中找到该文件。我尝试使用我可以提供的每个可能的路径并更改整个项目中的文件目录。但我一直得到同样的错误。

然后我再次从头开始改变我的课程,认为我的代码存在某种错误,我加载了属性文件。并且它似乎无法在部署为Web App时找到该文件。但我的测试应用程序工作正常。我在哪里放这个文件,我该如何使用它。我在这篇帖子https://stackoverflow.com/a/2161583/2999358中读过@BalusC的答案,但我不知道为什么会这样。有人可以帮我吗?

我正在使用Tomcat 8,Eclipse IDE并构建在JSF框架上。

加载我的属性文件的类

public class ConfigCache {
private static final File FILE = new File("./WebContent/WEB-INF/conf/config.properties");
private static final Properties PROPERTIES = new Properties();

public static final String JDBC_DRIVER = ConfigCache.getProperty("db.driverName");
public static final String DATABASE_URL = ConfigCache.getProperty("db.url");
public static final String DATABASE_USERNAME = ConfigCache.getProperty("db.user");
public static final String DATABASE_PASSWORD = ConfigCache.getProperty("db.pass");

public ConfigCache() {
}

public static String getProperty(String key) {
    if (PROPERTIES.isEmpty()) {
        loadProperties();
    }
    Object value;
    return (value = PROPERTIES.get(key)) == null ? "" : value.toString();
}

private static void loadProperties() {
    if (!FILE.exists()) {
        throw new IllegalArgumentException("The 'config.properties' has not been found.");
    }
    try {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(FILE);
            PROPERTIES.load(fis);
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException exp) {
                System.out.println("IOException @" + ConfigCache.class + " @ loadProperties() : " + exp);
            }
        }
    } catch (Exception exp) {
        System.out.println("Exception @" + ConfigCache.class + " @ loadProperties() : " + exp);
    }
}

}

文件夹结构

Project Folder Structure

3 个答案:

答案 0 :(得分:-1)

您可以爆炸(解压缩)war / ear文件并查看其内容或文件夹结构,并找出代码无效的原因。原因是文件夹WebContent不存在于你的耳朵/战争中,但只有在通过eclipse运行时才存在。这就是为什么它总是更好地遵循发布的链接中提供的解决方案,以便您可以从类路径中检索porperty文件。下面的代码在eclipse中获取属性文件,但不在服务器中获取。

private static final File FILE = new File("./WebContent/WEB-INF/conf/config.properties");

WAR文件的内容(来自JournelDev),它包含WEB-INF目录,但上面没有WebContent目录

enter image description here

答案 1 :(得分:-1)

试试这个。 把属性放在src文件夹中。

答案 2 :(得分:-1)

您的文件位于WEB-INF目录中。这意味着它是战争的一部分,可以作为课程路径的一部分到达。这是完全可以的,因为它使其可移植并且独立于Web容器安装(例如Tomcat)。

您可以将类路径中的任何文件作为资源加载:

getClass().getResourceAsStream("/conf/config.properties")

这意味着您可以像这样编写代码:

private static void loadProperties() {
        InputStream is = getClass().getResourceAsStream("/conf/config.properties");
        PROPERTIES.load(fis);
}

(省略错误处理)