【问题标题】:JNDI resources in TomcatTomcat 中的 JNDI 资源
【发布时间】:2011-06-28 13:35:33
【问题描述】:

在 Tomcat 中,看起来我必须在 context.xml 和我的 web.xml 中指定任何 JNDI 资源。它是否正确?有没有办法解决?我认为context.xml 中的一种配置就足够了。这是相关文档from the Tomcat User Guide

注意资源名称(这里, bean/MyBeanFactory 必须匹配 在 Web 应用程序中指定的值 部署描述符。

Glassfish 不需要以这种方式进行配置。在 Glassfish 中,您在服务器上配置 JNDI 资源(如 JDBC 连接池),应用程序代码通过 JNDI 查找获得对资源的引用。 web.xml 文件中不需要额外的条目。

我担心的是:如果 Glassfish 拒绝这个重复的 JNDI 配置,但 Tomcat 需要它,那么我突然需要支持两个 web.xml 文件,这取决于应用程序将部署到的环境。它看起来比它需要的更复杂和麻烦。

【问题讨论】:

    标签: tomcat configuration glassfish jndi


    【解决方案1】:

    Glassfish 支持 web.xml DTD 的所有元素,resource-env-ref 就是其中之一,因此您不必维护多个副本。 Glassfish 使用时会显式抛出错误吗?

    【讨论】:

    • 不确定 - 实际上仍然很难让它在 Tomcat 中正常工作 - 然后我将针对 Glassfish 重新测试。我仍然觉得奇怪的是 Tomcat 需要这个额外的配置,而 Glassfish 不需要。
    • 额外的配置内容是规范的一部分:我猜 glassfish 选择不使用它。 tomcat 默认上下文植根于 java:comp/env: 不完全确定您可以在不更改代码的情况下以您想要的样式进行绝对 JNDI 查找。
    【解决方案2】:

    context.xml 文件和web.xml 是完成大致相同事情的两种方法。 Tomcat 特有的第一个。第二个是标准的,由Servlet specification 和其他Java EE-related specs 定义。

    例如,described in the doc,您可以使用其中任何一个将初始化参数传递给您的网络应用程序:

    • <Context> <Parameter>…context.xml 文件中
    • <context-param> <param-name>…web.xml 文件中

    同样,两者都可用于定义要通过 JNDI 提供的资源。两者都可以用来定义生命周期事件的监听器。

    详情请看这个问题:context.xml vs web.xml in web application

    您不需要同时使用两者。但是,Tomcat documentation 建议如果使用 context.xml,您也可以在 web.xml 中重复。我不明白那个建议。

    那么为什么有两种方法呢?

    • 标准方式很有用,因为它是标准的。您可以将 Tomcat 换成 another Servlet container,而无需更改您的 web.xml 文件。
    • Tomcat 特定的方式很有用,因为它允许您做的比标准方式更多。例如,Tomcat 8.0.35 JNDI Resources HOW-TO 中的这句话:

    Tomcat 为无法在 web.xml 中指定的 JNDI 资源提供了许多 Tomcat 特定选项。其中包括在 Web 应用程序停止时能够更快地清理 JNDI 资源的 closeMethod 和控制是否为每次 JNDI 查找创建资源的新实例的单例。要使用这些配置选项,必须在 Web 应用程序的元素或 $CATALINA_BASE/conf/server.xml 的元素中指定资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2014-04-18
      • 1970-01-01
      • 2018-05-16
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多