【问题标题】:How to define default context elements with Tomcat?如何使用 Tomcat 定义默认上下文元素?
【发布时间】:2019-07-17 11:01:01
【问题描述】:

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

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

我们需要定义一个数据源和一个邮件服务器。如果我们在GlobalNamingResourcesconf/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 的战争定义资源,它会起作用:

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

提前致谢!

【问题讨论】:

    标签: java tomcat deployment war context.xml


    【解决方案1】:

    一种解决方案是:

    • 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文件的名称,则必须修改conf/Catalina/localhost/ROOT.xml文件中的docBase属性。

    【讨论】:

    • 这些说明有缺陷,但您走在正确的轨道上。不要将文件命名为ROOT.xml。相反,将其命名为 MyApp.xml,这将通过 XML 文件的名称定义上下文路径。
    • 更好的是,将META-INF/context.xml 打包到 WAR 文件中——使用适当的 WAR 文件名——然后像往常一样部署 WAR。 Tomcat 将自动使用 WAR 文件中的部署描述符。
    • @ChristopherSchultz 感谢您的回答。我没有指定,但我的 WAR 不再使用此解决方案命名为 ROOT.xml。
    • @ChristopherSchultz 将META-INF/context.xml 放入WAR 文件的解决方案有效,但并不令人满意,因为资源依赖于服务器,并且可以在多个服务器上部署相同的WAR。所以资源必须在 WAR 之外定义。
    • 哦,我没有意识到您想要使用 ROOT 上下文但不想指定 ROOT.war。在这种情况下使用 ROOT.xml 是正确的方法(并且在许多 SO 帖子和原始文档中都有介绍。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多