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

时间:2015-10-28 17:38:51

标签: java maven jdbc firebird jaybird

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

奇怪的是,如果我使用一个简单的控制台项目没有使用Maven,它可以按照规范说明的方式进行操作,所以问题是:有没有办法让Maven工作也评论一下上课注册?

2 个答案:

答案 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文件(如果可用),并且它有可能使用新技术。