java - 如何使用 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
.
提前致谢!
解决方案
一种解决方案是:
- 定义资源
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
。
推荐阅读
- twitter - iOS11 以上的 SLServiceTypeTwitter
- django - Django - 从单独的应用程序创建的实时数据库中读取
- xml - 使用 xsl 合并 XML 文件后如何在浏览器中显示 XML 标签
- java - xsd 的 Java Saxon 有效子树
- python - Gurobi Python 回调:我无法检索解决方案数据:LP 松弛、左节点等
- php - 递归 cURL 函数 php
- php - PHP cURL 在本地工作,在 Apache 服务器上缺失
- java - Sorting algortithm with index in java
- javascript - AJV is not validating my schema
- rest - 缺少调用 RestAPI 方法的请求标头“authToken”