我有一个使用JDBC和FirebirdSQL以及Java 8的Maven控制台应用程序,根据规范,不再需要添加类注册,因此注释了行Class.forName("org.firebirdsql.jdbc.FBDriver");
,但是当我运行项目时我收到错误:No suitable driver found for jdbc:firebirdsql://localhost/database
,但是如果我取消注释该行就可以了。
奇怪的是,如果我使用一个简单的控制台项目没有使用Maven,它可以按照规范说明的方式进行操作,所以问题是:有没有办法让Maven工作也评论一下上课注册?
答案 0 :(得分:4)
您似乎正在使用旧版本的Jaybird(FirebirdSQL JDBC驱动程序)。 2.2及更高版本实现了JDBC 4.0规范,该规范不需要Class.forName()
语法。
由于Mustang中包含Java SE服务提供程序机制,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
答案 1 :(得分:2)
旧的JDBC驱动程序不使用新的Java ServiceLoader框架。这意味着ClassLoader没有注册“JDBC服务提供者”,因为META-INF/services/java.sql.Driver
文件中的钩子不存在,因为文件没有退出。
您注释掉的代码行有一个“静态”块,它将在创建第一个实例时运行,并且该静态块的内容将JDBC驱动程序注册到DriverManager中。这是“更老”的做法,以及为什么你需要这条线才能发挥作用。
基本上,您正在尝试使用旧代码的新技术。获取一个新的JAR文件(如果可用),并且它有可能使用新技术。