2012-08-30 18 views
12

Ho visto diverse domande simili su StackOverflow, ma non hanno risolto il mio problema. This one è particolarmente utile, poiché punta allo tomcat documentation ufficiale e in particolare allo this section.tomcat7: impossibile caricare la classe di driver JDBC [com.mysql.jdbc.Driver]

Le soluzioni fornite sono, in breve: tomcat richiede i driver del database jdbc da copiare in $CATALINA_HOME/lib, perché non li troverà sotto WEB-INF/lib/. Ok, ma non funziona ancora per me, e sto diventando pazzo.

Vediamo se è possibile fornire ulteriori informazioni.

L'ambiente è Windows XP, Tomcat7, Eclipse Indigo, Java6 e Spring3.

mysql-connector è stato copiato $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:\> 

Probabilmente sapete che l'integrazione Tomcat di Eclipse crea una directory WTP-specifica per le sue implementazioni (CATALINA_BASE), quindi ho copiato mysql-connector anche lì (ho senza successo provato con la mysql-conector.jar in CATALINA_HOME, in CATALINA_BASE e in ciascuno di essi):

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:\> 

per quanto ho capito ca di Tomcat file talina.properties, sono entrambi aggiunti al classpath, quindi non mi aspettavo alcuna differenza, ma ci ho provato, per ogni evenienza.

La mia definizione di primavera origine dati è molto semplice:

<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> 

Ma quando ho riavviare Tomcat ottengo il seguente errore:

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 

Un altro suggerimento: usando Sysinternals Process Explorer posso vedere che la mysql-connector-java.jar è essere aperta da 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 

Tomcat @ Process Explorer

Ogni ulteriore idea?


Edit1: ho cercato di utilizzare Oracle e funziona!

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

L'origine dati:

<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> 

Che cosa sto facendo di sbagliato per MySQL?

+1

Hai provato loding lo stesso driver direttamente da una semplice applicatoin Java –

+0

Questa idea è stata la chiave per trovare il problema Vedere la risposta qui sotto –

risposta

9

risolto!

Arturs Il suggerimento di Licis era la chiave. In qualche modo il driver mysql era stato scaricato in modo errato. Sembrava un file .jar, ma non è riuscito a caricare. Tomcat stava mostrando solo il primo livello di eccezione:

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

Ma quando ho codificato un semplice HelloWorld con Class.forName ("com.mysql.jdbc.Driver"), il seguente errore è stato mostrato, invece:

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

Eureka! L'apertura del file .jar su WinRar mostra che può essere aperto ... ma con alcuni errori.

Il download del driver ha risolto il problema.

downvote per me :-(

+0

Contento che ti abbia aiutato. +1 per condividere la tua esperienza :) –

3

The solutions provided there is, in short: tomcat needs jdbc database drivers to be copied to $CATALINA_HOME/lib/ , because it will not find them under WEB-INF/lib/ . Ok, but it still does not work for me, and I am becoming mad.

Questo dipende da come si carica il driver.

Se si configura il driver all'interno di Tomcat e lo si fornisce all'applicazione, questa istruzione è corretta.

Ma si carica il driver direttamente all'interno dell'applicazione. Quindi entrambi i modi, $CATALINA_HOME/lib/ (in tomcat) e WEB-INF/lib/ (nell'applicazione) dovrebbero funzionare.

ma la primavera usare un modo speciale per caricare quella classe Class.forName(driverClassNameToUse, true, ClassUtils.getDefaultClassLoader()) e io non so come si comportano per i file in $CATALINA_HOME/lib/ quindi vorrei provare a mettere i file nella propria applicazione WEB-INF/lib/ cartella

+0

Ralph:?.. Grazie, ma io Maven mette già mysql-connector su WEB-INF/lib/senza alcuna modifica.Vedi anche la mia modifica sui test con Oracle ... –

+0

Dovrebbe funzionare, quindi il problema è probabilmente qualcos'altro. – Ralph

+0

I Sembra che stia facendo qualcosa di particolarmente sbagliato per mysql. –

Problemi correlati