当前位置: 首页 > 知识库问答 >
问题:

对于多个JDBC驱动程序,正确的复制策略是什么?

史智志
2023-03-14

我有下面的版本。格雷德尔在我的项目中

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。两个导入的jar中都存在驱动程序。实际上,这个Oracle JDBC依赖项导入多个JAR,它们之间有更多冲突文件(内容不同)(例如META-INF/native-image/native-image.properties和此目录中的其他文件)。

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

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

冲突文件是否常见?

共有1个答案

单于越
2023-03-14

考虑不要建造一个胖子。否则,您将需要将各种驱动程序中的META-INF/service/java.sql.驱动程序合并到一个文件中(自动或提供自己的)。如果不合并,自动驱动程序加载将不适用于未包含服务定义文件的驱动程序。如果不能或不想合并(或提供自己的版本),则需要使用Class.forName显式加载驱动程序。另请参见驱动程序类如何位于JDBC4中。

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

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

但是,如果这确实与您有关,或者您不知道文件的作用,那么更好的选择是不使用FATJAR(又称UberJAR),而是使用正确生成类路径(例如使用清单或启动程序文件)并将应用程序使用的各种库分开的部署方式。例如,请参见使用Gradle在清单中添加类路径。

 类似资料:
  • 问题内容: 在接手一个同事的项目后,我注意到他使用“ org.gjt.mm.mysql.Driver”作为MySQL 5的jdbc驱动程序,而不是更常见的“ com.mysql.jdbc.Driver”。它们都包含在我在Maven Central上找到的驱动程序中,该驱动程序似乎是该驱动程序的标准发行版。 当我查找gjt.org时,我发现了一些有关“ Mark的mysql驱动程序”的旧站点。 ht

  • 我正试图使用IntelliJ IDE从Spark连接到老虎机数据库。有人能帮助jdbc驱动程序(。jar)文件吗?我正在寻找“com.tigergraph.jdbc.驱动程序”。 我确实找到了下面的gitHub存储库,其中包含了所有必需的信息。java文件。但是,我不知道如何在我的spark项目中使用它。https://github.com/tigergraph/ecosys/tree/maste

  • 在我们正在处理的应用程序中,用户可以通过在文本字段中输入任意的JDBC连接URL来连接到外部RDBMS。我们的一个客户报告说,当他无意中试图连接到带有MySQL JDBC URL的Microsoft SQL server时,我们的应用程序服务器在0%的CPU下冻结(无限期)。 下面的Java片段说明了这种情况: 运行代码段: null 问题: 1)这可能是MariaDB JDBC驱动程序中的一个b

  • 问题内容: 昨天我遇到了一个大问题。在我当前的项目中,我使用Oracle JDBC的ojdbc6实现进行连接,但是我还需要处理例如oracle 8数据库,而使用此JAR完全不可能。您可能会说我应该使用ojdbc14例如,这在某些测试中是正确的,但是让我们假设以后我将需要处理来自同一供应商的2种数据库,但是我们知道BOTH和我都没有现有的实现需要同时加载它们。相同的接口(而且,不仅是相同的接口,相同

  • 我试图在使用OAuth2.0的移动应用程序的Web API中实现委托授权。根据规范,隐式授权流不支持刷新令牌,这意味着一旦某个访问令牌在特定时间内被授予,用户必须在令牌到期或被撤销时再次授予该应用程序的权限。

  • 我有一个Spring boot应用程序,它被容器化并发布到docker Hub。我有个Docker-copmse.yml:- 我不知道什么是正确的spring.datasource.url。我尝试了和。两种方法都出现连接错误。顺便说一句,容器运行得很好。我可以通过进行验证。我可以看到创建的数据库。正确的连接方式是什么? 更新问题:- 我在用飞道。现在有个例外:- 启动ApplicationCont