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

时间:2012-09-06 09:49:51

标签: java postgresql maven jdbc jar

  

可能重复:
  java error (No suitable driver found)

我有一个非常小的可以使用PostgreSQL DB,将它用作单个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与我上面写的完全一样(除了删失地址:))。 我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:11)

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

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

您可以使用maven-assembly-plugin代替maven-shade-plugin来正确合并这些文件,如here所述。

或者,您可以使用maven-assembly-plugin来回避失败的自动发现机制。