Nessun driver adatto trovato per jdbc in Java 8 con Maven


Ho un'applicazione console Maven che utilizza JDBC e FirebirdSQL e Java 8, secondo le specifiche, non è più necessario aggiungere la registrazione della classe, quindi la riga Class.forName("org.firebirdsql.jdbc.FBDriver"); viene commentata, ma quando eseguo il progetto ottengo l'errore: No suitable driver found for jdbc:firebirdsql://localhost/database, ma se a I decomment la riga funziona bene.

La cosa curiosa se uso un semplice progetto di console senza usare Maven funziona con la riga commentata come dice la specifica, quindi la domanda è: c'è un modo per lavorare con Maven anche commentando la linea della registrazione di classe?

Author: Mark Rotteveel, 2015-10-28

2 answers

Sembra che tu stia usando una vecchia versione di Jaybird (il driver JDBC FirebirdSQL). La versione 2.2 e successive implementano le specifiche JDBC 4.0, che non richiedono la sintassi Class.forName().

Grazie al meccanismo del provider di servizi Java SE incluso in Mustang, gli sviluppatori Java non hanno più bisogno di caricare esplicitamente i driver JDBC usando codice come Classe.forName () per registrare un driver JDBC. La classe DriverManager si occupa di questo individuando automaticamente un driver adatto quando il DriverManager.Viene chiamato il metodo getConnection ().

Quindi, aggiornare il driver Jaybird JDBC (link sotto) e semplicemente lasciare fuori il metodo Class.forName(). È legacy e non è necessario per i driver JDBC (JDBC versione 4.0 e versioni successive).

Come per la documentazione di Jaybird, dovresti usare quanto segue nel tuo POM:

<groupId>org.firebirdsql.jdbc</groupId>
<artifactId>jaybird-jdkXX</artifactId>
<version>2.2.9</version>
  • L'artifactId dipende dalla versione Java di destinazione: jaybird-jdk18, jaybird-jdk17 o jaybird-jdk16

Http://www.firebirdsql.org/en/jdbc-driver /

Http://www.onjava.com/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html

 4
Author: SnakeDoc, 2015-10-29 08:40:19

I vecchi driver JDBC non utilizzano il nuovo framework Java ServiceLoader. Ciò significa che il ClassLoader non registra il "Fornitore di servizi JDBC" perché gli hook nel file META-INF/services/java.sql.Driver non sono presenti in quanto il file non esce.

La riga di codice che si commenta ha un blocco "statico" che verrà eseguito alla creazione della prima istanza e il contenuto di quel blocco statico registra il driver JDBC nel DriverManager. Questo è il modo "più vecchio" di farlo, e perché hai bisogno di quella linea per questo lavorare.

Fondamentalmente, stai cercando di usare una nuova tecnica con il vecchio codice. Ottieni un nuovo file JAR (se disponibile) e c'è la possibilità che funzioni con la nuova tecnica.

 2
Author: Edwin Buck, 2015-10-28 18:42:31