Java Eclipse:在Tomcat中重写JNDI资源

Java Eclipse:在Tomcat中重写JNDI资源,java,eclipse,tomcat,jndi,Java,Eclipse,Tomcat,Jndi,我正在Eclipse中开发一个Java web应用程序,并将其部署到Eclipse运行的Tomcat实例中。我试图让这个应用程序通过JNDI资源元素与另一台主机上的数据库通信 应用程序中包含的context.xml文件尝试连接到运行在localhost上的MySQL服务器,如下所示: <?xml version="1.0" encoding="UTF-8"?> <Context> <Environment name="log4j.configuration

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

应用程序中包含的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>
...
    <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服务器下的文件),如下所示:



这里的基本问题是,您在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
文件和您的设置放在那里。然后在eclipse项目的项目属性中的
部署程序集中添加一个新的
路径/to/META-INF
META-INF
的额外映射

然后eclipse将用您的自定义上下文覆盖原始的
context.xml
,tomcat将接受您的设置。

这是一个精心设计的第一个问题。谢谢!长时间侦听器,第一次调用。您在Eclipse中使用的Tomcat版本是什么?具体是6.0.x还是7.0.x?这两个版本在这方面的表现是不同的。我使用的是6.0版。这是一个解决办法,但有点不太成熟。我很惊讶Eclipse的Tomcat集成(似乎)不支持可以在开发中使用的持久性上下文。您能再描述一下关于部署程序集的部分吗?在Eclipse4.6.1(Tomcat8.5.6)的项目属性中,我没有看到任何关于
META-INF
的内容。见我的相关问题。
<?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>