在Java Web应用程序(WAR)中存储配置文件的最佳位置是什么?

时间:2008-09-18 19:53:51

标签: java web-applications tomcat java-ee

我创建一个Web应用程序(WAR)并将其部署在Tomcat上。在 webapp 中,有一个页面,其中包含管理员可以输入某些配置数据的表单。我不想将这些数据存储在DBMS中,而只是存储在文件系统上的XML文件中。在哪里放?

我想将文件放在部署应用程序本身的目录树中的某个位置。我的配置文件应该在 WEB-INF 目录中吗?或者把它放在别的地方?

在servlet中使用什么Java代码来查找目录的绝对路径?或者可以通过相对路径访问它?

6 个答案:

答案 0 :(得分:48)

我们所做的是将它放在服务器上的一个单独目录中(您可以使用/ config,/ opt / config,/ root / config,/ home / username / config或任何你想要的东西)。当我们的servlet启动时,他们会读取XML文件,从中获取一些东西(最重要的是数据库连接信息),就是这样。

我问过为什么我们这样做了一次。

将所有内容存储在数据库中会很好,但显然您无法在数据库中存储数据库连接信息。

你可以对代码中的东西进行硬编码,但由于很多原因,这很丑陋。如果信息必须更改,则必须重新构建代码并重新部署。如果有人获得了您的代码或WAR文件的副本,他们就会获得该信息。

把东西放在WAR文件中似乎很好,但是如果你想改变很多东西,这可能是一个坏主意。问题是,如果你必须更改信息,那么下次重新部署它将覆盖文件,所以你忘记在WAR中内置的版本中所做的任何事情都会被遗忘。

文件系统中特殊位置的文件对我们来说非常有用。它没有任何重大缺点。你知道它在哪里,它是单独存储的,如果它们都需要不同的配置值,那么就可以很容易地部署到多台机器上(因为它不是WAR的一部分)。

我能想到的唯一能够正常工作的其他解决方案是将数据库中的所有内容保留在除DB登录信息之外。这将来自通过JVM检索的Java系统属性。这是Hans Doggen上面提到的Preferences API。我不认为它是在我们的应用程序最初开发时,如果它没有被使用。

至于访问配置文件的路径,它只是文件系统上的一个文件。您无需担心Web路径。因此,当您的servlet启动时,它只需在“/config/myapp/config.xml”(或其他)打开文件,它就会找到正确的东西。只是硬编码这个路径似乎对我来说是无害的。

答案 1 :(得分:16)

WEB-INF是放置配置文件的好地方。这是从servlet获取目录的绝对路径的一些代码。

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")

答案 2 :(得分:9)

将其放入WEB-INF会隐藏尝试直接通过网址访问的用户的XML文件,所以是的,我会说将其放在WEB-INF中。

答案 3 :(得分:5)

我不会将它存储在应用程序文件夹中,因为这会使用应用程序的新部署覆盖配置。

我建议您查看Preferences API,或者在users文件夹(运行Tomcat的用户)中写一些内容。

答案 4 :(得分:3)

答案取决于您打算如何读取和编写该配置文件。

例如,Spring框架使您能够use XML configuration files(或Java属性文件);这些可以存储在类路径中(例如,在WEB-INF目录中),文件系统的任何其他位置,甚至存储在内存中。如果您为此使用Spring,那么存储配置文件的最简单位置是在您的WEB-INF目录中,然后使用Spring的ClassPathXmlApplicationContext类来访问您的配置文件。

但同样,这一切都取决于您打算如何访问该文件。

答案 5 :(得分:1)

如果是你的自定义配置WEB-INF是个好地方。但是有些库可能需要配置才能驻留在WEB-INF / classes中。