Aucun pilote approprié n'a été trouvé pour jdbc en Java 8 avec Maven


J'ai une application de console Maven utilisant JDBC et FirebirdSQL et Java 8, selon la spécification, il n'est plus nécessaire d'ajouter l'enregistrement de classe, donc la ligne Class.forName("org.firebirdsql.jdbc.FBDriver"); est commentée, mais quand j'exécute le projet, j'obtiens l'erreur: No suitable driver found for jdbc:firebirdsql://localhost/database, mais si je décommente la ligne, cela fonctionne bien.

La chose curieuse si j'utilise un simple projet de console sans utiliser Maven cela fonctionne avec la ligne commentée comme le dit la spécification, donc la question est: y a-t-il un moyen de travailler avec Maven aussi commentant la ligne de l'enregistrement de classe?

Author: Mark Rotteveel, 2015-10-28

2 answers

Il semble que vous utilisiez une ancienne version de Jaybird (le pilote JDBC FirebirdSQL). Les versions 2.2 et supérieures implémentent la spécification JDBC 4.0, qui ne nécessite pas la syntaxe Class.forName().

Grâce au mécanisme de fournisseur de services Java SE inclus dans Mustang, les développeurs Java n'ont plus besoin de charger explicitement les pilotes JDBC en utilisant du code comme une classe.forName () pour enregistrer un pilote JDBC. La classe DriverManager s'occupe de cela en localisant automatiquement un conducteur approprié lorsque le DriverManager.la méthode getConnection() est appelée.

Alors, mettez à niveau votre pilote JDBC Jaybird (lien ci-dessous) et laissez simplement de côté la méthode Class.forName(). Il est hérité et n'est pas nécessaire pour les pilotes JDBC (JDBC version 4.0 et supérieure).

Selon la documentation Jaybird, vous devez utiliser ce qui suit dans votre POM:

<groupId>org.firebirdsql.jdbc</groupId>
<artifactId>jaybird-jdkXX</artifactId>
<version>2.2.9</version>
  • L'artifactId dépend de votre version Java cible: jaybird-jdk18, jaybird-jdk17 ou 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

Les anciens pilotes JDBC n'utilisent pas le nouveau framework Java ServiceLoader. Cela signifie que le ClassLoader n'enregistre pas le "Fournisseur de services JDBC" car les hooks dans le fichier META-INF/services/java.sql.Driver ne sont pas présents car le fichier ne se ferme pas.

La ligne de code que vous commentez a un bloc "statique" qui sera exécuté lors de la création de la première instance, et le contenu de ce bloc statique enregistre le pilote JDBC dans le DriverManager. C'est la façon "plus ancienne" de le faire, et pourquoi vous avez besoin de cette ligne pour cela travailler.

, Fondamentalement, vous essayez d'utiliser une nouvelle technique avec l'ancien code. Obtenez un nouveau fichier JAR (si disponible) et il y a une chance qu'il fonctionne avec la nouvelle technique.

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