Tomcat 部署覆盖 context.xml

Tomcat 部署覆盖 context.xml

我对 Tomcat 还很陌生,所以如果有任何错误,请指出。

我的问题是关于使用 Tomcat 管理器更新已部署的应用程序。但首先要说的是。我使用 META-INF/Context.xml 来存储数据库连接的连接信息,因此这对于应用程序部署到的每个服务器都是唯一的。我不确定这是否是最佳选择,但这是我知道的唯一方法。

因此,在更新应用程序时,重要的是不要修改此文件,因为我不想每次更新应用程序时都必须进入并重新进行所有更改。

对于更新,我使用 Tomcat Manager,并且尝试了不同的方法,但一切似乎都建立在取消部署然后部署新版本的过程之上。这样,Context.xml 将被删除/替换为一个空的 Context.xml 文件。

所以我的问题基本上是,如何更新正在运行的 web 应用程序,同时保持 Context.xml 不变?

顺便说一句,我正在运行 Tomcat 6.0.24。

答案1

我目前正在使用的设置有多个运行相同 web 应用程序的上下文,并且每个上下文都有不同的数据库设置(类似于您的设置,只是每个上下文都在不同的服务器上运行)。

您可以为每个服务器上的每个实例专门创建一个 context.xml,并将其放在 $TOMCAT_ROOT$/conf/Catalina/localhost 中,而不是将 context.xml 文件包含在 META-INF 中。当 Tomcat 启动上下文时,Catalina/localhost/context.xml 中的任何设置都将覆盖您的 Web 应用程序中的设置(通过您的 WEB-INF/web.xml 文件或 META-INF/context.xml 文件)。

我们遇到了一些小问题,但是 Catalina/localhost/context.xml 中定义的参数没有正确覆盖 Web 应用程序中定义的参数,但这可以通过向参数节点添加 override 属性轻松解决,如下所示:

<Parameter name="foo" value="bar" override="1"/>

文档tomcat 上下文更详细地描述了很多这方面的内容。

答案2

我的方法:

        // In debug there are no context
        // In production is de WAR / Context name 
        String database = servletContext.getContextPath();
        database = database.replace("/", "");
        if (database.isEmpty())
            database = "<my_default_context_name_only_debug>";

        getLogger().info("Database: " + database);

        dataSource = (DataSource) dataSourceCtx.lookup("jdbc/" + database);

相关内容