如何使用 Tomcat 定义默认上下文元素?

How to define default context elements with Tomcat?

我们在 tomcat 9 (apache-tomcat-9.0.22) 上部署了一个应用程序。

官方文档 (https://tomcat.apache.org/tomcat-9.0-doc/config/context.html) 说可以定义默认上下文元素,但它对我们不起作用。

我们需要定义一个数据源和一个邮件服务器。如果我们在 GlobalNamingResources 中的 conf/server.xml 文件中定义此资源,它就可以工作。

<GlobalNamingResources>
    <Resource name="mail" type="javax.mail.Session"... />
    <Resource name="jdbc/mydb" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"... />
</GlobalNamingResources>

但是在生产环境中,我们不能修改server.xml文件。所以我们需要在另一个文件中定义这个资源。

如果我们在 $CATALINA_BASE/conf/[enginename]/[hostname]/ROOT.xml 文件中使用名为 ROOT.war 的 war 定义资源,它会起作用:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Context configuration file for my web application -->
<Context>
    <Resource name="mail" type="javax.mail.Session"... />
    <Resource name="jdbc/mydb" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"... />
</Context>

这个解决方案可能令人满意,但我们的 war 文件必须有一个不同于 ROOT.war 的名称(如 MyApp_v42.war),并且它会随着每次更新而改变。我们无法在每次更新时重命名 xml 文件。

如果我们在 $CATALINA_BASE/conf/context.xml 文件或 $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default 文件中定义资源,如文档所述,我们将获得 javax.naming.NameNotFoundException.

提前致谢!

一个解决方案是:

  • conf/context.xml 中定义资源:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource name="mail" type="javax.mail.Session"... />
    <Resource name="jdbc/mydb" type="javax.sql.DataSource"... />
                               -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <Manager pathname="" />
</Context>
  • 使用 webapps 目录之外的部署,例如在 wars/

  • conf/Catalina/localhost/ 下创建一个 XML 文件 ROOT.xml 定义 docBase 属性,其路径相对于 webapps 目录:

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="../wars/MyApp.war"></Context>

这样:

  • conf/server.xml 文件未修改
  • war 文件的名称不是必需的 ROOT.xml
  • 资源在conf/context.xml
  • 中定义

但是:

  • 每个 conf/Catalina/localhost/ 中必须有一个文件。war
  • war不是auto-deployed
  • 如果更改根 war 文件的名称,则必须修改 conf/Catalina/localhost/ROOT.xml 文件中的 docBase 属性。