【问题标题】:tomcat7: Could not load JDBC driver class [com.mysql.jdbc.Driver]tomcat7:无法加载 JDBC 驱动程序类 [com.mysql.jdbc.Driver]
【发布时间】:2012-08-24 21:18:18
【问题描述】:

我在 stackoverflow 上看到了几个类似的问题,但它们并没有解决我的问题。 This one 特别有用,因为它指向官方的tomcat documentation,特别是this section

那里提供的解决方案,简而言之:tomcat需要将jdbc数据库驱动复制到$CATALINA_HOME/lib,因为它不会在WEB-INF/lib/下找到它们。好的,但它仍然对我不起作用,我正在生气。

让我们看看您是否可以提供任何进一步的想法。

环境是Windows XP、Tomcat7、Eclipse Indigo、Java6和Spring3

mysql-connector已复制到$CATALINA_HOME/lib

C:\>dir "c:\Program Files\Apache-Tomcat-7.0.12\lib"\mysql*
[...]
/2012  13:39           877.094 mysql-connector-java-5.1.21.jar
[...]
C:\>

您可能知道 Eclipse 的 Tomcat 集成为其部署创建了一个特定于 WTP 的目录 (CATALINA_BASE),所以我也复制了 mysql-connector 那里(我尝试在 CATALINA_HOME 中使用 mysql-conector.jar 未成功,在CATALINA_BASE 和他们两个):

C:\>dir c:\Share\genesis\wsEclipse-indigo\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\lib
[...]
29/08/2012  13:39           877.094 mysql-connector-java-5.1.21.jar
[...]
C:\>

据我了解 Tomcat 的 catalina.properties 文件,它们都被添加到类路径中,所以我没想到有什么区别,但我尝试了,以防万一。

我的spring数据源定义很简单:

  <bean id="securityDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/venus" />
    <property name="username" value="root" />
    <property name="password" value="" />
  </bean>

但是当我重新启动tomcat时出现以下错误:

ERROR: org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityDataSource' defined in ServletContext resource [/WEB-INF/spring/root-context.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [com.mysql.jdbc.Driver]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1396)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    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:4701)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5204)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5199)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [com.mysql.jdbc.Driver]
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1393)
    ... 21 more
30-ago-2012 8:38:11 org.apache.catalina.core.StandardContext listenerStart
GRAVE: Excepción enviando evento inicializado de contexto a instancia de escuchador de clase org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityDataSource' defined in ServletContext resource [/WEB-INF/spring/root-context.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [com.mysql.jdbc.Driver]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1396)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    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:4701)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5204)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5199)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [com.mysql.jdbc.Driver]
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1393)
    ... 21 more

另一个提示:使用 Sysinternals Process Explorer 我可以看到 mysql-connector-java.jar 正在被 Tomcat 打开:

"C:\Program Files\Java\jre6\bin\javaw.exe" -Dcatalina.base=C:\Share\genesis\wsEclipse-indigo\.metadata\.plugins\org.eclipse.wst.server.core\tmp0 "-Dcatalina.home=C:\Program Files\Apache-Tomcat-7.0.12" -Dwtp.deploy=C:\Share\genesis\wsEclipse-indigo\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps "-Djava.endorsed.dirs=C:\Program Files\Apache-Tomcat-7.0.12\endorsed" -Dfile.encoding=Cp1252 -classpath "C:\Program Files\Apache-Tomcat-7.0.12\bin\bootstrap.jar;C:\Program Files\Apache-Tomcat-7.0.12\bin\tomcat-juli.jar" org.apache.catalina.startup.Bootstrap start

还有什么想法吗?


EDIT1:我尝试过使用 Oracle,它可以工作!

C:\>dir "c:\Program Files\Apache-Tomcat-7.0.12\lib"\oci*
[...]
02/10/2006  22:36         1.545.954 ocijdbc10.jar
[...]
C:\>

数据源:

  <bean id="securityDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:oci:@BARVDB002D:1545:TFSDB0" />
    <property name="username" value="me" />
    <property name="password" value="qwerty" />
  </bean>

我对 mysql 做错了什么?

【问题讨论】:

  • 您是否尝试过从简单的 Java 应用程序中加载相同的驱动程序?
  • 这个想法是找到问题的关键。请参阅下面的答案。

标签: mysql spring tomcat tomcat7


【解决方案1】:

那里提供的解决方案,简而言之:tomcat需要将jdbc数据库驱动复制到$CATALINA_HOME/lib/,因为它不会在WEB-INF/lib/下找到它们。好的,但它仍然对我不起作用,我正在生气。

这取决于您如何加载驱动程序。

如果你在你的tomcat中配置驱动并提供给应用程序,那么这个说法是正确的。

但是您直接在应用程序中加载驱动程序。然后两种方式,$CATALINA_HOME/lib/(在 tomcat 中)和WEB-INF/lib/(在应用程序中)都应该工作。

但是 Spring 使用一种特殊的方式来加载该类 Class.forName(driverClassNameToUse, true, ClassUtils.getDefaultClassLoader()),我不知道它对于 $CATALINA_HOME/lib/ 中的文件的行为如何,所以我会尝试将这些文件放在您的应用程序 WEB-INF/lib/ 文件夹中

【讨论】:

  • 拉尔夫:谢谢,但我认为它不适用。 Maven 已经将 mysql-connector 放在 WEB-INF/lib/ 上,没有任何更改。另外,请参阅我对使用 Oracle 进行测试的编辑...
  • 我同意。看来我在为 mysql 做一些特别错误的事情。
  • 为了确定,我按照 Ralph 建议的方式添加了 oracle 驱动程序(即在 WEB-INF/lib 上,但不在 $CATALINA_HOME/lib/ 上,它可以工作,因为它用于 Spring,它加载应用程序初始化期间的驱动程序。但mysql仍然没有:-(
  • 在 WEB-INF/lib 中放置驱动程序(在我的情况下为 postgresql)也适用于我。但是maven应该自动加载驱动吗?
【解决方案2】:

解决了!

Arturs Licis 的建议是关键。不知何故,mysql驱动程序被错误地下载了。它似乎是一个 .jar 文件,但无法加载。 Tomcat 只显示了第一级异常:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
[...]

但是当我使用 Class.forName("com.mysql.jdbc.Driver") 编写一个非常简单的 helloworld 时,却显示了以下错误:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
[...]
Caused by: java.util.zip.ZipException: invalid LOC header (bad signature)
[...]

尤里卡!在 WinRar 上打开 .jar 文件显示可以打开...但是有一些错误。

再次下载驱动确实解决了问题。

为我自己投反对票 :-(

【讨论】:

  • 很高兴它对您有所帮助。 +1 分享您的经验:)
猜你喜欢
  • 2016-08-18
  • 2012-04-23
  • 1970-01-01
  • 2016-02-15
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
相关资源
最近更新 更多