java - 使用 maven-assembly-plugin 包含所需的驱动程序时未找到合适的驱动程序

标签 java postgresql maven jdbc jar

我也有一个非常小的,可以与 PostgreSQL 数据库一起使用,将它作为一个 jar 使用会非常方便。所以我确实试过像这样使用 maven-assembly-plugin:

<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<configuration>
    <archive>
        <manifest>
            <mainClass>pack.name.MainClass</mainClass>
        </manifest>
    </archive>
    <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
</configuration>

它工作得很好,我可以看到我需要的所有文件都添加到 jar 文件中,包括驱动程序文件,但是当我尝试运行它时,我得到一个:

java.sql.SQLException: No suitable driver found for jdbc:postgresql://<ip>:5432/dbname

我有这个:

<dependencies>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.3</version>
    </dependency> 
    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.1-901-1.jdbc4</version>
    </dependency>

在依赖项中,URL 与我上面写的完全一样(除了被审查的地址)。我错过了什么?

最佳答案

如果您不使用 Class.forName(...) 手动加载驱动程序,那么我认为您遇到了一个臭名昭著的问题 maven-assembly-plugin - 当文件来自不同的 jar 时,它会覆盖具有相同名称的文件。

在您的情况下,JDBC 驱动程序发现机制依赖于名为 /META-INF/services/java.sql.Driver 的文件,并且您至少有两个 jar在您的依赖项(Oracle 和 Postgres 驱动程序)中包含这样一个文件,因此其中一个在运行 maven-assembly-plugin 后丢失。

您可以使用 maven-shade-plugin 而不是 maven-assembly-plugin 正确地合并这些文件,如所述 here .

或者,您可以使用 Class.forName(...) 来回避失败的自动发现机制。

关于java - 使用 maven-assembly-plugin 包含所需的驱动程序时未找到合适的驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12297376/

相关文章:

java - Hadoop安装错误

java - 如何在 Firefox 19 中使用 Selenium WebDriver 进行鼠标悬停?

macos - 如何在 mac os x 10.8.2 上重置 postgresql 9.2 默认用户(通常为 'postgres' )密码?

java - 如何使 J-Unit Test 属性文件路径依赖于环境?

eclipse - (Maven+Eclipse)每个开发人员如何在本地处理jar?

java - 如何从日期变量中查找下一个和上一个日期

java - Android CardView 填充错误

postgresql - 无法使用ip地址从本地psql连接到postgresql

sql - 选择满足某些条件且在某一列中具有最大值的行

maven - 如何为运行(Cucumber)验收测试指定一个单独的 Maven 目标?