web-dev-qa-db-ja.com

tomcat7:JDBCドライバークラス[com.mysql.jdbc.Driver]をロードできませんでした

私はスタックオーバーフローに関していくつかの同様の質問を見ましたが、それらは私の問題を解決しませんでした。 これ は、公式の Tomcatのドキュメント および特別な このセクション を示しているため、特に便利です。

ここで提供されるソリューションは、簡単に言うと、Tomcatは$CATALINA_HOME/libでそれらを見つけられないため、jdbcデータベースドライバーを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をコピーしました(mysql-conector.jarCATALINA_HOME、およびその両方で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ファイルを理解している限り、これらは両方ともクラスパスに追加されているので、違いは予期していませんでしたが、念のため試してみました。

私の春のデータソース定義は非常に簡単です:

  <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

もう1つのヒント:Sysinternals Process Explorerを使用すると、Tomcatがmysql-connector-Java.jarを開いていることがわかります。

"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

Tomcat @ Process Explorer

これ以上のアイデアはありますか?


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の何が問題になっていますか?

13
Javier Sedano

解決しました!

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ファイルを開くと、開くことができることが示されますが、いくつかのエラーがあります。

ドライバーを再度ダウンロードすると、問題は解決しました。

自分への反対投票:-(

10
Javier Sedano

ここで提供されるソリューションは、簡単に言うと、Tomcatは_$CATALINA_HOME/lib/_でそれらを見つけられないため、jdbcデータベースドライバーを_WEB-INF/lib/_にコピーする必要があります。わかりましたが、それでも私にはうまくいきません、そして私は怒っています。

これは、ドライバーのロード方法によって異なります。

Tomcat内でドライバーを構成し、それをアプリケーションに提供する場合、このステートメントは正しいです。

ただし、アプリケーション内で直接ドライバーをロードします。次に、両方の方法で、_$CATALINA_HOME/lib/_(Tomcatの場合)および_WEB-INF/lib/_(アプリケーションの場合)が機能します。

しかし、Springは特別な方法でそのクラスClass.forName(driverClassNameToUse, true, ClassUtils.getDefaultClassLoader())をロードしますが、_$CATALINA_HOME/lib/_内のファイルに対してどのように動作するかわからないので、ファイルをアプリケーション_WEB-INF/lib/_フォルダーに配置しようとします

3
Ralph