【问题标题】:What is the correct DuplicateStrategy for multiple JDBC drivers?多个 JDBC 驱动程序的正确 DuplicateStrategy 是什么?
【发布时间】:2021-11-26 18:42:31
【问题描述】:

我的项目中有以下 build.gradle

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.oracle.database.jdbc:ojdbc11-production:21.3.0.0'
    implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre8'
}

tasks.named('jar') {
    setDuplicatesStrategy(DuplicatesStrategy.WARN)
    manifest {
        attributes 'Main-Class': 'com.example.App'
    }
    from {
        configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

文件META-INF/services/java.sql.Driver 存在于两个导入的jar 中。实际上,这个 Oracle JDBC 依赖项导入了多个 jar,它们之间有更多冲突的文件(内容不同)(例如 META-INF/native-image/native-image.properties 和此目录中的其他文件)。

当 DuplicatesStrategy 设置为 WARN 时,Oracle 驱动程序会覆盖 SQL Server JDBC 驱动程序的 META-INF/services/java.sql.Driver。覆盖此(和其他)文件的后果是什么?

我应该如何处理这些重复的文件?有没有办法从所有 jar 中获取所有文件? jar 的某些文件被覆盖的机会让我感到不安。

冲突文件常见吗?

【问题讨论】:

    标签: gradle jdbc jar


    【解决方案1】:

    考虑不构建 fatjar。否则,您需要将各种驱动程序中的META-INF/services/java.sql.Driver 合并到一个文件中(自动或提供您自己的文件)。如果您不合并,自动加载驱动程序将不适用于未包含服务定义文件的驱动程序。如果您不能或不想合并(或提供您自己的版本),您将需要使用Class.forName 显式加载驱动程序。另见How is driver class located in JDBC4

    至于使用DuplicateStrategy,可能最好使用FAIL并明确排除文件或位置,或者想出合并它们的策略,但这可能很麻烦。

    至于其他文件,我无法真正回答,但META-INF/native-image/* 似乎与在 GraalVM 中使用库有关,因此除非您使用它,否则您可以放心地忽略该目录中的文件。

    但是,如果这真的让您担心,或者您不知道文件的作用,更好的选择是不使用 fatjars(又名 uberjars),而是使用正确生成类路径的部署方式(例如使用清单或启动器文件)并将应用程序使用的各种库分开。例如,请参阅Add classpath in manifest using Gradle

    【讨论】:

    • 感谢您的回复!似乎不需要加载驱动程序来获得通过 DataSource 的连接,因此缺少META-INF/services/java.sql.Driver 不是问题(META-INF/native-image/* 也不是)。 FAIL + exclude 确实似乎是最不容易出错的策略,但是许可证也会被覆盖,它们需要留在 jar 中。您知道为文件指定单独的 DuplicateStrategy 的方法吗?至于在MANIFEST.MF 中指定类路径,需要下载依赖项并压缩到某个目录,对吧?
    • @EMEM 您很可能将驱动程序的名称指定为数据源配置的一部分(或使用驱动程序本身的数据源),因此不需要自动加载驱动程序。 Gradle 已经完成了依赖项的下载,您只需配置 Gradle 以将它们复制到正确的位置。至于为每个文件指定一个重复策略,我不知道这样的选项,但它可能可以通过多个复制任务来实现。
    • 我确实在使用来自驱动程序的数据源。
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2010-09-20
    • 2020-12-01
    • 2015-08-29
    • 2010-11-30
    相关资源
    最近更新 更多