2014-03-13 161 views
6

我正在研究Eclipse中的Java Web應用程序並將其部署到由Eclipse運行的Tomcat實例。我試圖讓這個應用程序通過JNDI Resource元素與另一個主機上的數據庫進行通信。Eclipse:覆蓋Tomcat中的JNDI資源

context.xml文件包含在應用程序試圖連接到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服務器覆蓋此資源?

+0

這是一個非常漂亮的第一個問題。 –

+0

謝謝!長時間的聽衆,第一次來電。 – jpappe

+0

您使用Eclipse的Tomcat版本是什麼?特別是6.0.x或7.0.x?兩者在這個領域的行爲是不同的。 –

回答

1

這裏的基本問題是,您在eclipse中編輯的context.xml對應於tomcat的conf目錄中的主要context.xml。然後應用程序上下文文件中的首選項優先。正如您在tomcat的正常部署生命週期中所描述的那樣,這非常好,因爲您只需編輯應用程序設置即可。

你可以做與日食創建上下文文件相同(這是什麼地方位於.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項目的項目屬性Deployment Assembly中添加一個從新的path/to/META-INFMETA-INF的映射。
然後eclipse會用你自定義的覆蓋原來的context.xml,tomcat應該進行設置。

+0

這是一種解決方法,但它有點冒失。我很驚訝Eclipse的Tomcat集成不(似乎)支持可用於開發的持久性上下文。 – jpappe

+0

你可以多描述一下'部署組件'的部分嗎?在Eclipse 4.6.1(Tomcat 8.5.6)中的項目屬性中,我沒有看到有關'META-INF'的任何信息。看到我的相關問題http://stackoverflow.com/q/40556940/421049。 –