一尘不染

如何在Tomcat中为Web应用程序提供上下文配置?

tomcat

我有一个Web应用程序,它依赖于安装后需要配置的一些资源和参数,例如JDBC连接。

我想到的是提供一个在部署应用程序时由Tomcat META-INF/context.xml复制到[engine-name]/[server- name]/[app- name].xml的文件。通过这种方式,我提供的只是一个战争文件,可以将其复制到appBase文件夹(webapps)中。Tomcat的文档如果有这样的文件,它将不会被覆盖,这确实很棒,因为部署后所做的更改不会丢失。

但是这里存在一个微妙的问题:由于我们通过复制到webapps目录来部署应用程序,因此Tomcat首先将卸载现有的应用程序以及配置文件。这样,配置文件将丢失/覆盖,这是不希望的。据我所知,Tomcat
不会修改此行为。

问题是:有没有一种方法可以解决此问题,方法是以一种Tomcat不会删除现有配置文件的方式安装该应用程序。或者,是否有更好的方法打包应用程序?

请注意,我们不想将autoDeploy设置为false,并且我们不能使用人工干预进行安装(这排除了使用Tomcat Manager Web应用程序的情况)。

如果我从.war文件中取出配置文件并将其另存为[engine-name]/[server-name]/[app- name].xml,则Tomcat仍将其与我的应用程序关联,并在复制新的.war文件后将其删除。

另一个假设是:我们事先不知道配置的值。我们将仅提供示例配置(如果需要,可以使用占位符),而实际配置将在以后的某个时间(不一定在安装时间内)执行。

谢谢


阅读 667

收藏
2020-06-16

共1个答案

一尘不染

我设法以某种方式解决了这个问题。

1- Tomcat的appBase 之外
的某个地方安装一个分解的WAR目录,让我们假设它在中/usr/local/MyApp。[如果您的应用程序在未爆炸的战争中运行,则可以在此步骤中使用WAR文件而不是WAR目录。

2-将上下文配置文件复制到[tomcat.conf]/[engine]/[hostname]目录中,我们称之为MyApp.xml。该文件将指向应用程序的位置:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Context configuration file for my web application -->
<Context docBase="/usr/local/MyApp" privileged="true" antiResourceLocking="false" antiJARLocking="false">
        <Resource name="jdbc/myapp-ds" auth="Container" type="javax.sql.DataSource"
                maxActive="100" maxIdle="30" maxWait="10000" username="XXX" password="XXX"
                driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb" />
</Context>

3-现在,您可以随意修改配置文件。

4-通过在/ usr / local / MyApp中复制应用程序的新版本来更新应用程序

笔记:

a)此解决方案也适用于未扩展的.war文件,但是由于我们使用Spring的Log4JConfigListener,因此不会从未爆炸的.war文件运行。Tomcat不会爆炸放在appBase(webapps)文件夹外的.war文件。

b)这种方法不会阻止您在/usr/local/MyApp/META-
INF/context.xml中包含context.xml,因为Tomcat在此配置中不会使用它。您可以在开发环境中使用它,将.war文件转储到appBase(webapps)文件夹中。

这是我到目前为止所取得的,仍在寻找更好的解决方案。

2020-06-16