【问题标题】:Using property files in Web Applications [duplicate]在 Web 应用程序中使用属性文件 [重复]
【发布时间】:2015-08-28 01:16:29
【问题描述】:

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

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

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

然后我再次从头开始更改我的课程,认为我的代码在加载属性文件时存在某种错误。当部署为 Web 应用程序时,它似乎也找不到该文件。但我的测试应用程序工作正常。我把这个文件放在哪里以及如何使用它。我已在此线程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);
    }
}

}

文件夹结构

【问题讨论】:

  • 我建议停止使用 [java] 标记 Java EE 相关问题。如您所见,您只吸引了那些甚至懒得阅读您在此处链接的问题的傻瓜。
  • 抱歉打错了。不会再发生了。 :)

标签: jsf properties-file web-inf


【解决方案1】:

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

【讨论】:

  • 我试过了。当我部署战争文件时没有任何效果。但作为 Java 应用程序,它可以成功加载。
  • @k9yosh ,您是否尝试阅读我的答案?如果您觉得同样不正确,请告诉我。
【解决方案2】:

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

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

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

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

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

(省略错误处理)

【讨论】:

  • @k9yosh 已经给出了这个答案的链接,但问题是为什么他目前的实施方式不起作用,这正是我的答案所解释的。
  • 我会试试这个并回复你。
【解决方案3】:

您可以分解(解压缩)您的 war/ear 文件并查看它的内容或文件夹结构,并找出您的代码不起作用的原因。原因是文件夹 WebContent 不存在于您的 ear/war 中,但仅在通过 eclipse 运行时才存在。这就是为什么最好遵循发布的链接中提供的解决方案,以便您可以从类路径中检索 porperty 文件。下面的代码在 Eclipse 中获取您的属性文件,但不在服务器中。

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

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

【讨论】:

  • 这不正确。 WEB-INF 中的一切都是战争的一部分。这是属性文件的访问方式,而不是错误的位置。
  • 我从未说过 WEB-INF 不会参与战争。我说目录 WebContent 不会在 WAR 中。请在投反对票之前阅读完整的答案。
  • @KalyanChavali 我明白你在说什么。我已经尝试过我以前的实现。我也试过这个。它不起作用。
猜你喜欢
  • 2013-06-18
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 2011-07-23
  • 2012-12-06
  • 1970-01-01
相关资源
最近更新 更多