如何使用 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
属性。
我们在 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
属性。