2012-09-06 10 views
5

Duplicar posibles:
java error (No suitable driver found)Sin controlador adecuado encontró cuando se incluyen los controladores necesarios con Maven-montaje-plugin

que tienen una muy pequeña también que trabaja con una base de datos PostgreSQL y se sería muy conveniente usarlo como un solo frasco. Así que de hecho He intentado usar el experto-montaje-plugin, así:

<artifactId>maven-assembly-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <archive> 
         <manifest> 
          <mainClass>pack.name.MainClass</mainClass> 
         </manifest> 
        </archive> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
       </configuration> 

y funciona perfectamente bien, puedo ver todos los archivos que requieren añade al archivo jar, incluyendo los archivos del conductor, pero cuando estoy tratando de ejecutarlo Puedo obtener una:

java.sql.SQLException: No suitable driver found for jdbc:postgresql://<ip>:5432/dbname 

tengo esto:

<dependencies> 
     <dependency> 
      <groupId>com.oracle</groupId> 
      <artifactId>ojdbc6</artifactId> 
      <version>11.2.0.3</version> 
     </dependency> 
     <dependency> 
      <groupId>postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.1-901-1.jdbc4</version> 
     </dependency> 

En las dependencias y la dirección URL es exactamente como he escrito anteriormente (excepto la dirección censurado :)). ¿Qué me estoy perdiendo?

Gracias!

+0

necesita agregar ese controlador a sus dependencias – ant

+0

El controlador ** está ** en las dependencias ... Y la sintaxis es correcta. – Scis

+0

¿Tiene 'Class.forName (...)' para cargar el controlador? – axtavt

Respuesta

10

Si no se utiliza Class.forName(...) para cargar el controlador manualmente, entonces creo que se enfrentaba a un problema con el infame maven-assembly-plugin - sobrescribe los archivos con el mismo nombre cuando vienen de diferentes jar s.

En su caso JDBC mecanismo de descubrimiento de controlador se basa en un archivo llamado /META-INF/services/java.sql.Driver, y que tiene al menos dos jar s que contienen un archivo de este tipo en sus dependencias (conductores de Oracle y Postgres), por lo tanto, una de ellas se pierde después de ejecutar maven-assembly-plugin.

Puede usar maven-shade-plugin en lugar de maven-assembly-plugin para fusionar estos archivos correctamente, como se describe here.

Como alternativa, puede usar Class.forName(...) para eludir el mecanismo de autodetección fallido.

+0

Gracias, el plugin de sombreado fue genial. Ese es un "problema conocido" importante para maven-assembly-plugin, probablemente nos mantendremos alejados de él ... – Scis

Cuestiones relacionadas