2011-08-28 71 views
1

摘要: Tomcat6無法識別WebRoot/WEB-INF/lib中的ojdbc14.jar。我想我不需要配置任何東西,只需將.jar文件放在那裏,它應該可以工作。Tomcat6忽略web-inf/lib

詳情:

我創建了一個Web應用程序,並把ojdbc14.jar的在WEB-INF/lib文件夾。當我啓動Tomcat6和訪問一個index.jsp頁面,該頁面創建一個對象,該對象啓動到我的oracle數據庫的連接,發生錯誤「不能加載JDBC驅動程序類'oracle.jdbc.OracleDriver'」。顯然Tomcat6無法識別web-inf/lib/ojdbc14.jar中的'oracle.jdbc.OracleDriver'類

我做了一些研究,推測原因如下:

  1. 的Tomcat6得到了加載類的一些不同的方式。他們在發佈的每個版本中進行更改。或者
  2. Tomcat6有一個錯誤。我在Tomcat3中發現了一個類似的bug(請參閱https://bugs.eclipse.org/bugs/show_bug.cgi?id=249044)。但我懷疑這個bug可能會持續這麼多版本。
  3. Tomcat6已經將ojdbc14.jar的內容包含在它自己的lib文件中,並且再次將它添加到web-inf/lib中有衝突。我不相信這一點,因爲從WEB-INF/lib刪除ojdbc14.jar後,問題依然存在。

這裏是我的web應用程序結構:

  • 的WebRoot
    • WEB-INF
      • 禮 '一種用於啓動連接類' b
        • ojdbc14.jar的
    • 的index.jsp

錯誤:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.OracleDriver' 
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:766) 
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540) 
    at com.demo6.DataSourceExample.getConnection(DataSourceExample.java:18) 
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:63) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:384) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:169) 
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:760) 
    ... 21 more 
+0

我加載類的方式是通過調用'Class.forName(「oracle.jdbc.OracleDriver」);' – stackoverflower

回答

9

堆棧跟蹤告訴你已經在Tomcat的一面創建了DataSource作爲<Resource>。在這種情況下,JDBC驅動程序JAR文件確實需要放在Tomcat的一側,而Tomcat則負責管理DataSource,而不是您的web應用程序。將它放在Tomcat/lib中,此異常應該消失。您也可以將其放到外部文件夾中,並將其路徑添加到Tomcat常用類路徑中,如common.loader文件中的文件所定義。

請注意,您不需要手動加載驅動程序。只需抓住DataSource,然後從中獲取Connection

+0

是的,它的工作。但是我經歷了一個更普遍的問題:爲什麼Tomcat6不能在WEB-INF/lib中識別我的.jar文件?它不僅僅是ojdbc.jar,而是任何.jar。畢竟,將每個.jar文件放在Tomcat/lib中並不總是一個好主意。 – stackoverflower

+1

只是因爲Tomcat管理數據源,而不是webapp。 '/ WEB-INF/lib'專門用於webapp本身。我沒有說你應該把每個JAR放在'Tomcat/lib'中,只需要它*需要的JAR *。 – BalusC

+0

+1文字良好。 –