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

2022-08-31 17:37:45

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

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

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


答案 1

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

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

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

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

将内容放在WAR文件中似乎不错,但是如果您想更改太多内容,则可能是一个坏主意。问题是,如果您必须更改信息,那么下次重新部署它将覆盖文件,因此您在构建到WAR中的版本中不记得更改的任何内容都会被遗忘。

文件系统上特殊位置的文件对我们来说效果很好。它没有任何大的缺点。您知道它在哪里,它是单独存储的,如果它们都需要不同的配置值(因为它不是WAR的一部分),则可以轻松地部署到多台计算机。

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

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


答案 2

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

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

推荐