我无法理解为什么我会使用context.xml文件来声明资源,在我的例子中是数据库连接池。希望我在以下反对使用context.xml
的参数中直接得到了我的事实据我所知,资源 在/META-INF/context.xml中声明 仅限于 上下文,所以没有理由这样做 所以要分享资源。
声明连接 池资源以这种方式创建一个 依赖于容器 classloader,所以如果我这样做,例如,希望 改变我的数据库驱动程序,我 必须重新启动容器,而不仅仅是 我的背景。
我也创建了一个依赖 容器之类的东西,比如JNDI 做了一个独立的测试工具。
最后,我必须跳过 构建时间用于切换资源 在测试和生产之间 资源,例如。
这些问题都不是无法克服的,但在纸面上看起来更简单,只需创建一个连接池并将其挂钩到我的上下文范围内。
我想知道在什么情况下context.xml文件是正确的答案?
答案 0 :(得分:1)
我看到的唯一正当理由是,如果您希望Tomcat能够使用您的连接池进行基本的用户身份验证调用,如果您已将其设置为使用JDBC UserAuth上下文,则可能需要Tomcat有连接池。
答案 1 :(得分:1)
您可能想要使用context.xml
的另一个原因是override servlet init parameters which then maybe used to configure任意数量的事情,包括您的DBCP可能会像Spring一样管理。
这可能优于系统属性和/或环境变量,因为您可以在单个容器中部署同一WAR的多个副本,而无需修改WAR,并且它们的配置不会重叠。
By the way the context.xml
can live outside of the WAR(请参阅Tomcat关于该文档的文档或下面的代码段):
可以明确定义单个上下文元素:
- 在应用程序文件中的/META-INF/context.xml中的单个文件中。 (可选)(基于Host的copyXML属性) 这可能会复制到$ CATALINA_BASE / conf / [enginename] / [hostname] /和 重命名为应用程序的基本文件名加上“.xml”扩展名。
- 在$ CATALINA_BASE / conf / [enginename] / [hostname] /目录中的单个文件(扩展名为“.xml”)中。上下文 路径和版本将从文件的基本名称派生( 文件名减去.xml扩展名)。此文件将始终采用 优先于Web应用程序中打包的任何context.xml文件 META-INF目录。
- 主conf / server.xml中的Host元素。
可以定义适用于多个Web的默认Context元素 应用。单个Web应用程序的配置将覆盖任何内容 配置为其中一个默认值。任何嵌套元素,例如 在默认上下文中定义的元素将是 为默认应用的每个上下文创建一次。他们会的 不在Context元素之间共享。
- 在$ CATALINA_BASE / conf / context.xml文件中:所有Web应用程序都将加载Context元素信息。
- 在$ CATALINA_BASE / conf / [enginename] / [hostname] /context.xml.default文件中: Context元素信息将由所有Web应用程序加载 那个主人。