2010-11-19 51 views
0

我在本地PC上設置了Postgres 9.0.1 SQL Server和Tomcat 5.5.28。兩者都運行良好。但是我還沒有能夠配置Tomcat來通過JNDI提供DataSource。我想我已經遵循了從Tomcat頁面到這封信的JNDI HOW-TO(以及從其他頁面嘗試了其他一些如何操作)。但每次Tomcat啓動時,他會顯示錯誤消息:Tomcat 5.5在啓動時無法識別DataSource(空組件Catalina:type = DataSource)

SEVERE: Null component Catalina:type=DataSource,path=/MyApp,host=localhost,class=javax.sql.DataSource,name="jdbc/postgres" 

的Tomcat仍然沒有開始,但我的數據庫的代碼將無法正常工作,因爲我InitialContext.lookup什麼也沒有結束。

Postgres的驅動程序 「PostgreSQL相關8.4-701.jdbc4.jar」 被複制到以下文件夾:

I:\ Apache軟件基金會\ Tomcat的5.5 \ common \ lib文件

I:\阿帕奇軟件基金會\ Tomcat的5.5 \的webapps \ MyApp的\ WEB-INF \ lib中

這裏是我的MyApp的/ META-INF/context.xml中:

<Context path="/MyApp" docBase="MyApp" crossContext="true" reloadable="true" debug="1"> 
    <Resource name="jdbc/postgres" 
     auth="Container" 
      type="javax.sql.DataSource" 
      username="postgres" 
      password="xxx" 
      driverClassName="org.postgresql.Driver" 
      url="jdbc:postgresql://localhost/MyDatabase" 
      maxWait="1000" 
      maxActive="20" 
      maxIdle="10"> 
    </Resource> 
</Context> 

這裏是我的MyApp的/ WEB-INF的摘錄/web.xml:

<web-app> 
… 
<resource-ref> 
    <description> 
     Postgres resource reference to a factory 
    </description> 
    <res-ref-name> 
     jdbc/postgres 
    </res-ref-name> 
    <res-type> 
     javax.sql.DataSource 
    </res-type> 
    <res-auth> 
     Container 
    </res-auth> 
    </resource-ref> 
</web-app> 

我的項目被Eclipse部署爲WAR,Tomcat在啓動時將WAR作爲文件夾進行爆炸。現在奇怪的是:如果我不是手動啓動Tomcat,而是通過Eclipse啓動,一切正常! Tomcat沒有拿出上面的錯誤信息。 我發現Eclipse在啓動Tomcat本身時使用自己的server.xml,context.xml等,但即使將這些文件與Tomcat的常規配置文件進行比較,我發現的唯一區別是Eclipse服務器中的以下附加行.XML閉幕的「主機」標籤之前:

<Context docBase="MyApp" path="/MyApp" reloadable="true" source="org.eclipse.jst.j2ee.server:MyApp"/> 

但即使是在這條線複製到Tomcat的server.xml中自己(不帶「源」 -attribute),它不不使用Eclipse工作。因此,Eclipse必須做一些「額外的事情」,這使得找到DataSource成爲可能,而「普通」的Tomcat配置卻失敗了。由於我必須將WAR部署到不同的服務器上(沒有Eclipse),因此我需要幫助才能在不使用Eclipse的情況下運行。我認爲我的代碼是可以的,因爲它可以在Eclipse的Tomcat上正常工作,但是我的Tomcat 5.5的配置必須有問題。有任何想法嗎?

回答

2

在這個問題上花費了一些時間之後,我發現了一種避免Tomcat錯誤信息的方法。看來我的Eclipse配置有問題,因爲它配置爲將一些Tomcat自帶的jar添加到文件夾「I:\ Apache Software Foundation \ Tomcat 5.5 \ webapps \ MyApp \ WEB-INF \ lib」中。在將Eclipse的設置更改爲不包含它們,但將這些庫作爲引用的那些之後,它們不再包含在WAR文件中,並且Tomcat啓動時沒有錯誤。更確切地說,下面的三個jar被複制到我的webapp的lib中,爲了避免這個消息:「naming-factory.jar」,「naming-factory-dbcp.jar」和「naming-resources.jar 」。有趣的是,雖然Tomcat現在開始很好,但結果仍然相同:如果從Eclipse內部開始,我的webapp將成功通過JNDI查找數據源,但是當我在不使用Eclipse的情況下啓動Tomcat時,webapp仍然會嘗試訪問數據庫時出現以下錯誤消息時失敗:

Cannot create JDBC driver of class '' for connect URL 'null' 

我花了一些時間來完成此工作。我不得不放棄定義特定於應用程序的數據源的首選方法,而是定義全局數據源。我仍然不知道爲什麼Tomcat拒絕瞭解我的應用程序特定設置,但至少有一個可以繞過這個問題。以下是解決我的所有問題,讓我JNDI查找步驟:

  1. 修改標籤內的「GlobalNamingResources」%CATALINA_HOME%/ conf目錄/ server.xml中server.xml文件:在這裏,我添加了完成已經在我的context.xml中的「Resource」標籤部分(參見上文)。

  2. 修改%CATALINA_HOME%/ conf/context.xml文件context.xml文件 「上下文」 標籤中:在這裏,我添加了一行:<ResourceLink global="jdbc/postgres" name="jdbc/postgres" type="javax.sql.DataSource"/>

我離開了特定的Web應用程序的Web。 xml和context.xml保持不變(如上所示)。一切都在工作。我發佈解決方案來解決我發現自己的問題,希望其他有類似問題的人也能受益。

+0

只需一個附加說明:「不能創建JDBC驅動程序」錯誤不會發生在Tomcat 7上。今天,我放置了允許Tomcat 5.5的WAR文件。在Tomcat 7安裝上產生這個錯誤。在Tomcat 7中,我不需要定義全局資源的解決方法 - 看起來只是Tomcat 5.5在定義特定於應用程序的數據源時遇到了問題。 – Ray 2010-11-24 20:01:09

+0

在您的'MyApp/META-INF/context.xml'中,'Context'元素不應該設置'path'或'docBase'集合,因爲它們是在Web應用程序級定義的。參考[Tomcat 5.5的上下文](http://tomcat.apache.org/tomcat-5.5-doc/config/context.html) – 2010-12-06 03:57:54