首页 > 解决方案 > 如何使用 Tomcat 定义默认上下文元素?

问题描述

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

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

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

<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 的战争在文件中定义资源,它可以工作:

<?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.

提前致谢!

标签: javatomcatdeploymentwarcontext.xml

解决方案


一种解决方案是:

  • 定义资源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/

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

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

这样 :

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

但 :

  • conf/Catalina/localhost/每个 .war 中必须有一个文件
  • 战争不是自动部署的
  • 如果更改根war文件的名称,则必须修改文件中的docBase属性conf/Catalina/localhost/ROOT.xml

推荐阅读