1

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

奇怪的是,如果我使用一个没有使用 Maven 的简单控制台项目,它可以与规范所述的注释行一起使用,所以问题是:有没有办法让 Maven 也注释类注册的行?

4

2 回答 2

4

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

得益于 Mustang 中包含的 Java SE Service Provider 机制,Java 开发人员不再需要使用 Class.forName() 之类的代码显式加载 JDBC 驱动程序来注册 JDBC 驱动程序。DriverManager 类通过在调用 DriverManager.getConnection() 方法时自动定位合适的驱动程序来解决这个问题。

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

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

<groupId>org.firebirdsql.jdbc</groupId>
<artifactId>jaybird-jdkXX</artifactId>
<version>2.2.9</version>
  • artifactId 取决于您的目标 Java 版本:jaybird-jdk18、jaybird-jdk17 或 jaybird-jdk16

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

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

于 2015-10-28T18:28:31.267 回答
2

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

您注释掉的代码行有一个“静态”块,它将在第一个实例创建时运行,并且该静态块的内容将 JDBC 驱动程序注册到 DriverManager。这是“旧”的做法,也是为什么你需要这条线才能让它工作。

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

于 2015-10-28T18:42:31.863 回答