Eclipse:在Tomcat中覆盖JNDI资源

时间:2014-03-13 10:43:51

标签: java eclipse tomcat jndi

我正在使用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服务器下显示的那个&#34; Servers&# 34;项目)如此:

<?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控制台),我甚至看到它吐出了正确的&#34; mykey&# 34;值。但是,初始化在尝试从configDB读取时失败。

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

我已经尝试了几种方法来实现这一点,包括将这些信息放在Tomcat的server.xml文件中,但似乎没有任何效果。或者,更准确地说,它有点类似,因为它读取的是环境值,而不是资源。

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

1 个答案:

答案 0 :(得分:2)

这里的基本问题是,您在eclipse中编辑的context.xml对应于tomcat的context.xml目录中的主conf。然后,应用程序上下文文件中的首选项优先。正如您在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,tomcat应该采取您的设置。