【问题标题】:Tomcat: java.sql.SQLException: Unable to load class: com.mysql.jdbc.Driver from ClassLoaderTomcat:java.sql.SQLException:无法从 ClassLoader 加载类:com.mysql.jdbc.Driver
【发布时间】:2019-09-25 01:09:22
【问题描述】:

在服务器上运行 Web 应用程序时,出现以下异常:

使用的服务器: Apache Tomcat 8.5

异常: java.sql.SQLException:无法从 ClassLoader 加载类:com.mysql.jdbc.Driver

我已经尝试了很多东西,包括将 ojdbc6.jar 放在 WEB-INF/lib 文件夹中, 将 jar 放在 apache tomcat lib 文件夹中,在项目的构建路径中,我手动添加了 jar,同样基于谷歌的发现尝试了一些在我的情况下没有成功的周转。

从 Web 应用程序的角度来看,类或资源加载按以下顺序查看以下存储库:

  1. JVM 的引导类
  2. /WEB-INF/Web 应用程序的类
  3. /WEB-INF/lib/*.jar 您的 Web 应用程序
  4. 系统类加载器类(如上所述)
  5. 通用类加载器类(如上所述)

我的 jar 在 /WEB-INF/lib/ 文件夹中。

完整的堆栈跟踪。

java.sql.SQLException: Unable to load class: com.mysql.jdbc.Driver from ClassLoader:java.net.URLClassLoader@76ed5528;ClassLoader:ParallelWebappClassLoader
  context: ROOT
  delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@76ed5528

    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:283)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:718)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:650)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:468)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:143)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107)
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:554)
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:241)
    at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:94)
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:839)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:173)
    at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1091)
    at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:661)
    at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:249)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5087)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1404)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1394)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: Unable to load class: com.mysql.jdbc.Driver from ClassLoader:java.net.URLClassLoader@76ed5528;ClassLoader:ParallelWebappClassLoader
  context: ROOT
  delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@76ed5528

    at org.apache.tomcat.jdbc.pool.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:56)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:271)
    ... 25 more
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.tomcat.jdbc.pool.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:38)
    ... 26 more

May 07, 2019 4:04:12 PM org.apache.naming.NamingContext lookup
WARNING: Unexpected exception resolving reference
java.sql.SQLException: Unable to load class: com.mysql.jdbc.Driver from ClassLoader:java.net.URLClassLoader@76ed5528;ClassLoader:ParallelWebappClassLoader
  context: ROOT
  delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@76ed5528

    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:283)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:718)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:650)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:468)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:143)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107)
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:554)
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:241)
    at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:94)
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:839)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:173)
    at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1091)
    at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:661)
    at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:249)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5087)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1404)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1394)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: Unable to load class: com.mysql.jdbc.Driver from ClassLoader:java.net.URLClassLoader@76ed5528;ClassLoader:ParallelWebappClassLoader
  context: ROOT
  delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@76ed5528

    at org.apache.tomcat.jdbc.pool.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:56)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:271)
    ... 25 more
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.tomcat.jdbc.pool.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:38)
    ... 26 more

May 07, 2019 4:04:12 PM org.apache.catalina.core.NamingContextListener addResource
WARNING: Failed to register in JMX: javax.naming.NamingException: Unable to load class: com.mysql.jdbc.Driver from ClassLoader:java.net.URLClassLoader@76ed5528;ClassLoader:ParallelWebappClassLoader
  cont8ext: ROOT
  delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@76ed552

预期结果:它不能抛出任何 jar 异常,因为 jar 已经存在于 /WEB-INF/lib/ 以及 tomcat/lib 文件夹中。

实际结果:如上所述抛出异常。

【问题讨论】:

    标签: java jar classloader tomcat8


    【解决方案1】:

    我想在经过几次头脑风暴后发布答案(至少在我的情况下)。

    WEB-INF/lib 文件夹应该包含两个 jar,如果在某些奇怪的情况下(我的情况)没有被类加载器从那里拾取,请将其复制到 tomcat/lib 文件夹中。

    它对我有用,所以发布答案,我愿意接受任何其他观点。

    【讨论】:

      【解决方案2】:

      您显然正在尝试从 Oracle JDBC JAR 文件 (ojdbc6.jar) 加载 MySQL JDBC 驱动程序类 (com.mysql.jdbc.Driver)

      这行不通。

      如果您尝试与 Oracle 数据库通信,则需要为 Oracle JDBC 使用 Driver 类名。

      如果您尝试与 MySQL 数据库通信,则需要使用适当的 JConnector 驱动程序。


      根据您的 cmets,问题在于您将 JDBC 驱动程序 JAR 文件放在错误的位置。如果您使用的是 Tomcat 的 JNDI Datasource 配置机制,则驱动程序 JAR 需要在 $CATALINA_HOME/lib ... 中。

      这是因为驱动程序是由核心 Tomcat 代码加载的,而不是由您的 web 应用程序加载的。您的 webapp 的 WEB-INF/lib 目录不会位于核心类加载器的类路径中。

      【讨论】:

      • 我同时使用两个数据库,为 oracle 使用 ojdbc6.jar,我也为 mySql 定义了 my-sql-connector jar。 MYSQL 连接器 jar 在 pom.xml 依赖中定义,相应的 jar 在 maven 依赖文件夹中也可用。
      • 它得到了解决,实际上mySql连接器jar类不是由classloader加载的,这对我来说也是个谜,因为我在pom.xml中定义了很多依赖关系,包括mysql连接器jar的情况,但是不知何故,它没有被加载,而所有其他 jars 类也在代码中使用,如果它不是从该位置选择的,那么它也会为这些类的使用获得异常,但事实并非如此。
      • 无论如何解决/解决方法是我已经将 mysql-connector jar 复制到了 tomcat/lib 文件夹中。我也会发布相同的答案,但仍然困惑为什么我的 sql jar 需要它,还有其他 jar 位于同一位置,它们被代码正确捕获。
      • 我们如何识别,我们正在使用哪个 JNDI 数据源。?
      • 通过查看您的 webapp 的配置。这就是链接文档所说的。如果您没有使用 JNDI 数据源,请查看配置/源代码/webapp 文档以了解您实际配置数据库的方式。
      【解决方案3】:

      我在 Debian 10 中处理 Java 项目 时遇到此错误。

      问题是我有多个 .jar 文件用于 MySQL JDBC 连接器,即:

      mysql-connector-java-5.1.27.jar
      mysql-connector-java-5.1.27.jar-1
      

      这是我修复它的方法

      我只是删除了从主文件开始的两个文件:

      sudo rm -rf mysql-connector-java-5.1.27.jar
      sudo rm -rf mysql-connector-java-5.1.27.jar-1
      

      然后我再次将文件的副本下载到tomcat(/opt/tomcat/lib)的lib目录中:

      sudo wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.27/mysql-connector-java-5.1.27.jar
      

      然后一切都恢复正常了。

      就是这样。

      我希望这会有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-22
        • 2013-05-06
        • 2021-06-21
        • 2016-08-18
        • 2012-04-23
        • 2016-01-12
        相关资源
        最近更新 更多