使用 Maven 在 Java 8 中找不到适合 jdbc 的驱动程序

No suitable driver found for jdbc in Java 8 with Maven

我有一个使用 JDBC 和 FirebirdSQL 和 Java 8 的 Maven 控制台应用程序,根据规范,不再需要添加 class 注册,所以该行Class.forName("org.firebirdsql.jdbc.FBDriver"); 被注释,但是当我 运行 项目时,我得到错误:No suitable driver found for jdbc:firebirdsql://localhost/database,但是如果我取消注释该行它工作正常。

奇怪的是,如果我使用一个简单的控制台项目 w/o 使用 Maven,它可以按照规范所述与注释行一起工作,所以问题是:是否有一种方法也可以使用 Maven 进行注释class 注册行?

看来您使用的是旧版本的 Jaybird(FirebirdSQL JDBC 驱动程序)。 2.2 及以上版本实现了 JDBC 4.0 规范,不需要 Class.forName() 语法。

Thanks to the Java SE Service Provider mechanism included in Mustang, Java developers no longer need to explicitly load JDBC drivers using code like Class.forName() to register a JDBC driver. The DriverManager class takes care of this by automatically locating a suitable driver when the DriverManager.getConnection() method is called.

因此,升级您的 Jaybird JDBC 驱动程序(下面的 link)并简单地省略 Class.forName() 方法。它是遗留的,JDBC 驱动程序(JDBC 4.0 及更高版本)不需要。

根据 Jaybird 文档,您应该在 POM 中使用以下内容:

<groupId>org.firebirdsql.jdbc</groupId>
<artifactId>jaybird-jdkXX</artifactId>
<version>2.2.9</version>
  • The artifactId depends on your target Java version: jaybird-jdk18, jaybird-jdk17, or jaybird-jdk16

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

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

旧的 JDBC 驱动程序不使用新的 Java ServiceLoader 框架。这意味着 ClassLoader 没有注册 "JDBC Service Provider",因为 META-INF/services/java.sql.Driver 文件中的挂钩不存在,因为文件没有退出。

您注释掉的代码行有一个 "static" 块,它将在第一个实例创建时得到 运行,并且该静态块的内容注册 JDBC Driver 进入 Driver 管理器。这就是 "older" 的实现方式,以及为什么需要该行才能正常工作。

基本上,您是在尝试对旧代码使用新技术。获取一个新的 JAR 文件(如果可用),它有可能适用于新技术。