Java Tomcat6忽略web inf/lib

Java Tomcat6忽略web inf/lib,java,tomcat,jdbc,classloader,web-inf,Java,Tomcat,Jdbc,Classloader,Web Inf,简介:Tomcat6无法识别WebRoot/WEB-INF/lib中的ojdbc14.jar。我想我不需要配置任何东西,只要把.jar文件放在那里就可以了 详细信息: 我已经创建了一个web应用程序,并将ojdbc14.jar放在web-INF/lib文件夹中。当我启动Tomcat6并访问index.jsp页面,该页面创建了一个启动到我的oracle数据库连接的对象时,会出现一个错误:“无法加载JDBC驱动程序类‘oracle.JDBC.OracleDriver’”。显然Tomcat6无法识别w

简介: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”类

我做了一些研究并推测了以下原因:

  • Tomcat6有一些不同的加载类的方法。他们在发布的每个版本中都会更改它。或
  • Tomcat6有一个bug。我在Tomcat3中发现了一个类似的bug(参见这里)。但我怀疑这个bug能持续这么多版本
  • Tomcat6已经在它自己的lib文件中包含了ojdbc14.jar的内容,再次将其添加到web inf/lib会产生冲突。我不相信这一点,因为从WEB-INF/lib中删除ojdbc14.jar后,问题仍然存在
  • 以下是我的web应用程序结构:

    • 网根
      • WEB-INF
        • 班级
          • “用于启动连接的类”
        • 解放党
          • 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
    

    stacktrace告诉您已经在Tomcat端创建了一个
    数据源作为
    。在这种情况下,JDBC驱动程序JAR文件确实需要放在Tomcat的一边,而管理
    数据源的是Tomcat,而不是您的webapp。把它放到Tomcat/lib中,这个异常就会消失。您还可以将其放到外部文件夹中,并将其路径添加到Tomcat的公共类路径,该路径由
    /conf/catalina.properties
    文件中的
    common.loader
    属性定义


    请注意,您不需要手动加载驱动程序。只需抓取
    数据源
    ,然后从中获取
    连接

    我加载类的方式是调用“class.forName(“oracle.jdbc.OracleDriver”);”是的,成功了。但我想问一个更一般的问题:为什么Tomcat6不能识别WEB-INF/lib中的.jar文件?不仅仅是ojdbc.jar,还有任何.jar。毕竟,将每个.jar文件放在Tomcat/lib中并不总是一个好主意,因为Tomcat管理的是数据源,而不是webapp。
    /WEB-INF/lib
    仅限于webapp本身。我没有说你应该把每个罐子都放在
    Tomcat/lib
    中,只放在它需要的罐子里。