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

我创build一个Web应用程序(WAR)并将其部署到Tomcat上。 在Web应用程序中有一个页面,其中一个表单可以让pipe理员input一些configuration数据。 我不希望将这些数据存储在DBMS中,而只是存储在文件系统上的XML文件中。 在哪里放?

我想将文件放在应用程序本身所在的目录树的某处。 我的configuration文件应该在WEB-INF目录下吗? 或者把它放在别的地方?

什么是在servlet中使用的Java代码来查找目录的绝对path? 还是可以用相对path访问?

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

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

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

你可以在代码中对代码进行硬编码,但是由于许多原因,这很丑陋。 如果信息必须改变,你必须重build代码并重新部署。 如果有人得到你的代码或WAR文件的副本,他们会得到这些信息。

把东西放在WAR文件中看起来不错,但是如果你想改变的东西太多,这可能是一个坏主意。 问题是,如果你必须改变这些信息,那么下次你重新部署它将会覆盖这个文件,所以你忘了在WAR中build立的版本中记不得改变的东西。

在文件系统上的一个特殊的地方的文件对我们来说工作得很好。 它没有任何大的缺点。 你知道它在哪里,它被分开存储,如果它们都需要不同的configuration值(因为它不是WAR的一部分),可以轻松地部署到多台机器上。

我能想到的唯一的其他解决scheme将工作得很好将保持除DBlogin信息之外的所有数据库。 这将来自通过JVM检索的Java系统属性。 这是上面Hans Doggen提到的Preferences API。 当我们的应用程序第一次被开发的时候,我不认为它是在周围,如果它没有被使用的话。

至于访问configuration文件的path,它只是文件系统上的一个文件。 您不必担心networkingpath。 所以,当你的servlet启动时,只需在“/config/myapp/config.xml”(或其他)中打开文件,它就会find正确的东西。 只是硬编码的path,这对我来说似乎是相当无害的。

WEB-INF是放置你的configuration文件的好地方。 这里有一些代码来从servlet获取目录的绝对path。

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

把它放在WEB-INF会将XML文件从试图直接通过URL访问的用户隐藏起来,所以是的,我把它放在WEB-INF

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

我build议你看一下Preferences API,或者在用户文件夹(运行Tomcat的用户)中写一些东西。

这个答案取决于你打算如何读写configuration文件。

例如,Spring框架使您能够使用XMLconfiguration文件 (或Java属性文件); 这些可以存储在您的类path(例如,在WEB-INF目录中),文件系统的任何其他地方,甚至存储器中。 如果你想使用Spring,那么最简单的方法就是在你的WEB-INF目录下,然后使用Spring的ClassPathXmlApplicationContext类来访问你的configuration文件。

但是,这一切都取决于你打算如何访问该文件。

如果这是你的自定义configurationWEB-INF是一个很好的地方。 但有些库可能需要configuration驻留在WEB-INF / classes中。