java Shadow Jar使用gradle将两个JDBC驱动程序添加到一个jar文件

nvbavucw  于 2023-02-14  发布在  Java
关注(0)|答案(1)|浏览(119)

当我尝试使用gradle构建fat jar文件时遇到了一个问题。是否有办法配置gradle以支持JAR文件中的多个JDBC驱动程序?我在我的META-INF/services/java.sqlDriver中注意到,它将采用任何JDBC库。因此,当运行jar文件时,我经常会看到此错误。

java.sql.SQLException: No suitable driver
    at java.sql/java.sql.DriverManager.getDriver(DriverManager.java:299)

我发现这个问题的解决方案是在初始化数据库连接之前添加Class.forName('jdbcDriver'),但我发现对于JTDS库,您不再需要它,因为JDBC type 4可以根据连接字符串自动检测您需要哪个驱动程序。
我的build.gradle文件

plugins {
    id("application")
    id("com.github.johnrengelman.shadow") version "7.1.0"
}

dependencies {
    implementation group: 'net.sourceforge.jtds', name: 'jtds', version: '1.3.1'
    implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.26'
}

我的连接字符串
jdbc:jtds:sqlserver://localhost:1111/db;user=TEST;password=DUMMY
我使用的是Java 17和Gradle 7.3.3

lqfhib0f

lqfhib0f1#

您需要配置Gradle Shadow插件以合并提供程序配置文件。此处介绍了如何执行此操作:

合并服务描述符文件

Java库通常在JAR的META-INF/services目录中包含服务描述符文件。服务描述符通常包含特定 * service * 支持的类的行分隔列表。在运行时,将读取此文件并将其用于配置库或应用程序行为。
多个依赖项可能使用同一个服务描述符文件名,这种情况下,通常希望将文件的每个示例的内容合并到一个输出文件中,ServiceFileTransformer类用于执行这种合并,默认情况下,它会将META-INF/services下的每个文件副本合并到输出JAR中的一个文件中。

// Merging Service Files
shadowJar {
  mergeServiceFiles()
}

上面的代码片段是调用transform(ServiceFileTransformer.class)的方便语法
如果使用Kotlin DSL,则如下所示:

tasks {
    shadowJar {
        mergeServiceFiles()
    }
}

或者:

tasks.shadowJar {
    mergeServiceFiles()
}

相关问题