Tomcat6忽略web-inf/lib

sta*_*wer 2 java tomcat jdbc web-inf classloader

简介: Tomcat6无法识别WebRoot/WEB-INF/lib中的ojdbc14.jar.我想我不需要配置任何东西,只需将.jar文件放在那里就可以了.

细节:

我已经创建了一个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中发现了类似的错误(请参阅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
        • '启动连接的类'
      • LIB
        • 为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
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 10

stacktrace告诉你已经在Tomcat中创建了一个DataSourceas <Resource>.在这种情况下,JDBC驱动程序JAR文件确实需要放在Tomcat的端,以及管理它而DataSource不是你的webapp 的Tomcat .放入它,Tomcat/lib这个异常应该消失.您也可以将其放在外部文件夹中,并将其路径添加到Tomcat的公共类路径中,如文件中的common.loader属性所定义/conf/catalina.properties.

请注意,您无需手动加载驱动程序.抓住它DataSource然后从中获取Connection它.

  • 那是因为Tomcat管理数据源,而不是webapp。/ WEB-INF / lib是Webapp专有的。我没有说过您应该将每个JAR都放在`Tomcat / lib`中,只是*需要*的JAR。 (2认同)