java - 导出到 JAR 文件时找不到合适的驱动程序?
问题描述
我正在尝试将我的项目放入 JAR 中,以便可以将其作为 CLI 运行。我正在使用两个 JDBC 连接器,一个用于 MySQL,一个用于 PostgreSQL。如果我在 IDE 中运行它们,它们都位于同一个目录中并且可以正常工作。当我创建 JAR 时,MySQL 连接器仍然可以正常工作,但是在尝试建立与 PostgreSQL 的连接时,会出现以下错误。 真正让我恼火的是连接器似乎包含在 jar 的构建中。 MySQL 连接器和 PostgreSQL 连接器都在构建中列出。我该如何解决这个问题?
解决方案
问题是所有符合 JDBC-4 的 JDBC 驱动程序都包含一个文件,该文件/META-INF/services/java.sql.Driver
列出java.sql.Driver
了 JAR 文件中的实现。用于java.sql.DriverManager
加载可用的 JDBC 驱动程序。
您用于合并的过程显然不会将驱动程序中的不同文件合并到一个文件中,因此它只有一个驱动程序的内容。因此,不会自动加载其他驱动程序。
可能的解决方案:
- 不要将 JAR 文件合并到单个 JAR 中,而是使用 的
Class-Path
属性META-INF/MANIFEST.MF
来指定您使用的 JAR,并使用以下命令执行您的程序java -jar your.jar
- 确保
META-INF/services/java.sql.Driver
正确合并(或者可能提供您自己的),具体取决于您的合并方式,可能有一个选项来配置哪些文件需要合并 Class.forName("com.mysql.cj.jdbc.Driver")
使用and显式加载驱动程序Class.forName("org.postgresql.Driver")
(如果合并文件的顺序发生更改,并且另一个文件获胜,则同时执行此操作以防止出现问题)
推荐阅读
- java - 使用 LocalDate 将一个日期更改为另一种日期格式
- list - 如何使用 SwiftUI 使这个 ForEach 函数工作?
- android - 我想通过 Web 服务将 android 应用程序与 sql server 连接起来
- javascript - MongoDB不更新数据
- flutter - Flutter 将 SingleChildScrollView 或 ListView 添加到屏幕中的部分小部件
- android-sqlite - 我想在不根据行数据的情况下在完整列中输入数据
- swift - 根据标签文本动态改变单元格高度
- java - 我们如何使用公钥从托管在服务器中的应用程序使用 JSch 连接到 SFTP 服务器
- python - 使用 kubernetes cronjobs 调度 django 命令
- java - 如何生成没有重复号码的 4 位密码