首页 > 解决方案 > 导出到 JAR 文件时找不到合适的驱动程序?

问题描述

我正在尝试将我的项目放入 JAR 中,以便可以将其作为 CLI 运行。我正在使用两个 JDBC 连接器,一个用于 MySQL,一个用于 PostgreSQL。如果我在 IDE 中运行它们,它们都位于同一个目录中并且可以正常工作。当我创建 JAR 时,MySQL 连接器仍然可以正常工作,但是在尝试建立与 PostgreSQL 的连接时,会出现以下错误。 运行我的 jar 时的终端输出 真正让我恼火的是连接器似乎包含在 jar 的构建中。 在此处输入图像描述 MySQL 连接器和 PostgreSQL 连接器都在构建中列出。我该如何解决这个问题?

标签: javamysqlpostgresqljdbcjar

解决方案


问题是所有符合 JDBC-4 的 JDBC 驱动程序都包含一个文件,该文件/META-INF/services/java.sql.Driver列出java.sql.Driver了 JAR 文件中的实现。用于java.sql.DriverManager加载可用的 JDBC 驱动程序。

您用于合并的过程显然不会将驱动程序中的不同文件合并到一个文件中,因此它只有一个驱动程序的内容。因此,不会自动加载其他驱动程序。

可能的解决方案:

  1. 不要将 JAR 文件合并到单个 JAR 中,而是使用 的Class-Path属性META-INF/MANIFEST.MF来指定您使用的 JAR,并使用以下命令执行您的程序java -jar your.jar
  2. 确保META-INF/services/java.sql.Driver正确合并(或者可能提供您自己的),具体取决于您的合并方式,可能有一个选项来配置哪些文件需要合并
  3. Class.forName("com.mysql.cj.jdbc.Driver")使用and显式加载驱动程序Class.forName("org.postgresql.Driver")(如果合并文件的顺序发生更改,并且另一个文件获胜,则同时执行此操作以防止出现问题)

推荐阅读