【问题标题】:Eclipse: Overriding JNDI Resource in TomcatEclipse:在 Tomcat 中覆盖 JNDI 资源
【发布时间】:2014-04-18 00:54:17
【问题描述】:

我正在 Eclipse 中开发 Java Web 应用程序并部署到由 Eclipse 运行的 Tomcat 实例。我试图让这个应用程序通过 JNDI Resource 元素与另一台主机上的数据库通信。

应用程序中包含的 context.xml 文件尝试连接到在 localhost 上运行的 MySQL 服务器,如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<Context>
    <Environment name="log4j.configuration"
    value="/path/to/installed/log4j.properties"
    type="java.lang.String" />

    <Resource name="jdbc/configDB" auth="Container" type="javax.sql.DataSource"
    username="dbuser" password="dbpassword" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/dbname" maxActive="8"
    validationQuery="SELECT 1" testOnBorrow="true" />

    <Environment name="mykey" value="installed" type="java.lang.String" />

</Context>

当我将它安装在实际主机上时,此配置有效。即正确读取环境值并连接到数据库。

我也可以将它安装在单独的主机上并编辑 /etc/tomcat6/conf/Catalina/localhost/myaplication.xml 以更改 JDBC URL,如下所示:

...
    <Resource name="jdbc/configDB" auth="Container" type="javax.sql.DataSource"
    username="dbuser" password="dbpassword" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://otherhost:3306/dbname" maxActive="8"
    validationQuery="SELECT 1" testOnBorrow="true" />
...

此配置也有效。换句话说,我非常有信心我的应用程序正确地使用了 JNDI。

所以,现在我想在 Eclipse 中将它部署到我桌面上的 Tomcat。我已经以标准方式将项目添加到 Tomcat,并且我已经编辑了服务器的 context.xml 文件(即 Eclipse 在“服务器”项目中我的 Tomcat 服务器下显示的文件),如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<Context>
    <Environment name="log4j.configuration"
    value=C:\workspace\myapplication\src\main\resources\conf\log_to_tomcat_console_log4j.properties"
    type="java.lang.String" />

    <Resource name="jdbc/configDB" auth="Container" type="javax.sql.DataSource"
    username="dbuser" password="dbpassword" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://otherhost:3306/dbname" maxActive="8"
    validationQuery="SELECT 1" testOnBorrow="true" />

    <Environment name="mykey" value="desktop" type="java.lang.String" />

</Context>

当我在 Eclipse 中重新启动 Tomcat 时,日志显示 Log4J 文件的路径被正确读取(因为它开始记录到 Tomcat 控制台),我什至看到它吐出了正确的“mykey”值。但是,当它尝试从configDB 读取时,初始化失败。

起初,我认为这是连接问题,但排除后,我在调试器中重新启动了 Tomcat,并检查了从 JNDI 读取的 DataSource;它的 URL 指向 localhost,这意味着它使用的是应用程序的 context.xml 文件中的那个,而不是 Tomcat 的!

我已经尝试了几种方法来使其正常工作,包括将此信息放入 Tomcat 的 server.xml 文件中,但似乎没有任何效果。或者,更准确地说,它有点工作,因为它读取的是环境值而不是资源。

我在这里做错了什么?如何让 Eclipse 的 Tomcat 服务器覆盖此资源?

【问题讨论】:

  • 这是一个精心设计的第一个问题。
  • 谢谢!长期聆听者,第一次来电者。
  • 您在 Eclipse 中使用的是什么版本的 Tomcat?具体是 6.0.x 还是 7.0.x?两者在这方面的行为是不同的。
  • 我使用的是 6.0 版。

标签: java eclipse tomcat jndi


【解决方案1】:

这里的基本问题是,你在eclipse中编辑的context.xml对应于tomcat的conf目录下的主context.xml。然后应用程序上下文文件中的首选项优先。正如您在 tomcat 的正常部署生命周期中已经描述的那样,这非常好,因为您只需编辑应用程序设置。

您可以对 eclipse 创建的上下文文件(位于 .metadata/.plugins/org.eclipse.wst.server.core/tmp0/conf/Catalina/localhost 的某处)执行相同的操作,但是一旦您更改原始上下文文件 (META-INF/context.xml) 中的某些内容,它将被覆盖。 所以实际上你需要在那里进行更改,但这通常是没有问题的,因为这个文件必须在没有自定义更改的情况下部署。

但这里有一个解决方法:您可以通过滥用部署程序集让 eclipse 使用另一个 META-INF/context.xml。在其他地方创建一个新的META-INF 目录,并在其中放置一个带有您的设置的context.xml 文件。然后在 Deployment Assembly 的 Eclipse 项目的项目属性中添加一个从新的 path/to/META-INFMETA-INF 的附加映射。
然后eclipse会用你自定义的context.xml覆盖原来的context.xml,tomcat应该接受你的设置。

【讨论】:

  • 这是一种解决方法,但它有点 hacky。我很惊讶 Eclipse 的 Tomcat 集成不(似乎)支持可用于开发的持久上下文。
  • 你能多描述一下Deployment Assembly的部分吗?在 Eclipse 4.6.1 (Tomcat 8.5.6) 的项目属性中,我没有看到任何关于 META-INF 的信息。请参阅我的相关问题stackoverflow.com/q/40556940/421049
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 2018-05-16
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多