【问题标题】:NoClassDefFoundError: com/mysql/jdbc/StringUtils Tomcat 6NoClassDefFoundError:com/mysql/jdbc/StringUtils Tomcat 6
【发布时间】:2012-06-13 00:10:30
【问题描述】:

所以基本上我使用 maven 以我一直做的相同方式组织我的项目,但是我在 catalina.out 中收到一个错误,告诉我它无法在 com.mysql.jdbc 中找到 StringUtils 类,即使我可以看到jar在war类路径中。我在不同的服务器上没有遇到与 Tomcat7 相同的问题,这让我相信某处有一个库类掩盖了我在实际项目中拥有的 jar 文件。这是一个例外:

原因:java.lang.NoClassDefFoundError: com/mysql/jdbc/StringUtils

我的maven依赖如下:

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.20</version>
        </dependency>

当我可以在 WEB-INF 的 lib 部分看到 jar 并且我可以在 jar 中看到该类时,我无法理解如何在类路径中找不到该类。有人知道这里会发生什么吗?感谢您的帮助。

如果您需要更多信息,请告诉我。

完整的堆栈跟踪:(我使用 Apache 的 BasicDataSource)。

    Throwable occurred: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'voiceManager' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.voiceforge.api.swift.VoiceManager]: Constructor threw exception; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL 'jdbc:mysql://localhost/vf2?autoReconnect=true'
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:288)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1035)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:939)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4338)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:882)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:522)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1283)
    at sun.reflect.GeneratedMethodAccessor66.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:611)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:848)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:773)
    at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1471)
    at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:250)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:186)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:530)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:736)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.voiceforge.api.swift.VoiceManager]: Constructor threw exception; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL 'jdbc:mysql://localhost/vf2?autoReconnect=true'
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:162)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:110)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:280)
    ... 48 more
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL 'jdbc:mysql://localhost/vf2?autoReconnect=true'
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:382)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:456)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:464)
    at com.voiceforge.api.dao.VoiceforgeDaoImpl.getVoiceList(VoiceforgeDaoImpl.java:86)
    at com.voiceforge.api.swift.VoiceManager.refreshVoices(VoiceManager.java:33)
    at com.voiceforge.api.swift.VoiceManager.<init>(VoiceManager.java:23)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:56)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:527)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
    ... 50 more
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL 'jdbc:mysql://localhost/vf2?autoReconnect=true'
    at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
    ... 61 more
Caused by: java.lang.NoClassDefFoundError: com/mysql/jdbc/StringUtils
    at com.mysql.jdbc.NonRegisteringDriver.parseURL(NonRegisteringDriver.java:582)
    at com.mysql.jdbc.NonRegisteringDriver.acceptsURL(NonRegisteringDriver.java:236)
    at java.sql.DriverManager.getDriver(DriverManager.java:443)
    at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
    ... 65 more

【问题讨论】:

  • catalina.out 实际上报告了它在哪个 JAR 文件中查找该类?这听起来很奇怪。请将异常堆栈跟踪添加到您的问题中。
  • 已添加,感谢查看。
  • 嗯,这是一个 NoClassDefFoundError,这是类版本不兼容问题的症状。您应该检查您的类路径是否有多个版本的 MySQL JAR 部署,或者您可能在应用程序的某处扩展了 MySQL 类。

标签: java mysql maven jdbc tomcat6


【解决方案1】:

NoClassDefFoundError 可能是很多事情的征兆,但首先要检查的是该类实际上是否在您部署的 web 应用的类路径上。

  • 检查 MySQL 连接器 JAR 是否在 webapp 的 WEB-INF/lib 目录中,并检查它是否实际包含异常表示无法加载的类 (com.mysql.jdbc.StringUtils)。

  • 检查网络容器的核心或共享库类路径中没有 JAR 文件的杂散副本。

  • 如果上述方法未能给出明确的原因,请检查日志中是否存在其他(早期)类加载异常。您向我们展示的那个可能存在嵌套异常。可能有更早的例外。例如,如果类初始化失败(由于未经检查的异常),那么所有后续加载该类或相关类的尝试都将抛出异常......而无需重新报告问题的原始原因。

    李>

另一种可能性是您的 WAR 文件 POM 正在合并到具有冲突依赖项的 JAR 中。或者您(实际上)允许使用依赖排除在模块构建链中进一步发生冲突。


stacktrace中有一条线索:

Caused by: java.lang.NoClassDefFoundError: com/mysql/jdbc/StringUtils
    at com.mysql.jdbc.NonRegisteringDriver.parseURL(NonRegisteringDriver.java:582)
    ....

请注意,NoClassDefFoundError 不会在 Class.forName(...) 调用中抛出。您应该获取您正在使用的 JAR 版本的源代码,并查看它在该行的作用。

我怀疑这会引发异常,因为之前的类加载尝试失败了。日志文件中是否有任何早期的堆栈跟踪?

【讨论】:

  • 所以我运行 mvn dependency:tree 并没有在任何地方看到 mysql jdbc jar 列为依赖项。我还检查了 WEB-INF/lib 文件夹,并没有找到多个版本的 jar。是否可能是共享的 tomcat6 库版本不兼容?
  • 另外,给出了完整的堆栈跟踪。
  • 是的。有可能的。您是否检查了 mysql JAR 的共享 tomcat6 目录?你检查过你找到的 mysql JAR 里面有那个类吗?
  • 没有mysql连接器jar。我更担心该类被打包在位于那里的其他 jar 中。
  • 如果您对此感到担心,可以随时使用jar 命令检查所有 JAR 文件。但考虑到 StringUtils 类的实际作用,这似乎不太可能。 (它是 MySQL 特有的……)
【解决方案2】:

其实可能不是找不到的StringUtils类。这可能会表现为 ClassNotFoundException。 NoClassDefFoundError 有点不同,我的意思是找不到 StringUtils 依赖的东西。

【讨论】:

  • 我复制/粘贴了完整的堆栈跟踪。
【解决方案3】:

我最终安装了 Tomcat 7,错误消失了。我不知道为什么这个错误会很不幸地出现,但希望这可以在未来帮助其他人。

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 2012-06-15
    • 2012-12-08
    • 2010-11-30
    • 1970-01-01
    • 2010-12-06
    • 2011-06-15
    • 1970-01-01
    相关资源
    最近更新 更多