【问题标题】:Can't find class of postgresql driver找不到 postgresql 驱动程序的类
【发布时间】:2019-03-27 20:37:40
【问题描述】:

我正在尝试将 HikariCP 库用于 Java 中的 PostgreSQL 连接池。我正在使用 Maven,但出现此错误:java.lang.ClassNotFoundException: org.postgresql.Driver

我尝试过使用不同版本的 PostgreSQL 驱动程序,但没有一个对我有利。 (我做了更多,但我一直面临这个问题,我没有注意到)

org.postgresql.ds.PGSimpleDataSourceorg.postgresql.Drivercom.impossibl.postgres.jdbc.PGDataSource 仍然会产生此错误,即使在 HikariCP guide 中说要使用第一个或第三个。我从研究中发现的第二个。

我的专家:

(...)
    <build>
        <defaultGoal>clean package</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <minimizeJar>true</minimizeJar>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

    <repositories>
        <repository>
            <id>spigotmc-repo</id>
            <url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.spigotmc</groupId>
            <artifactId>spigot-api</artifactId>
            <version>1.12.2-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>3.3.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.6.4</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.5</version>
        </dependency>
    </dependencies>
</project>

我使用什么来产生这个错误:

        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("Failed to load.");
        }

        HikariConfig config = new HikariConfig("database.properties");
        ds = new HikariDataSource(config);

(构造函数HikariDataSource(config);也会产生这个错误)

我相信发生这种情况的原因是驱动程序没有被放入类路径 - 但是,我尝试过的所有努力似乎都无法做到这一点。驱动程序不在最终 jar 中的问题(我相信): .

实际错误:

[20:16:35 WARN]: java.lang.ClassNotFoundException: org.postgresql.Driver
[20:16:35 WARN]:        at java.net.URLClassLoader.findClass(Unknown Source)
[20:16:35 WARN]:        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:152)
[20:16:35 WARN]:        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:100)
[20:16:35 WARN]:        at java.lang.ClassLoader.loadClass(Unknown Source)
[20:16:35 WARN]:        at java.lang.ClassLoader.loadClass(Unknown Source)
[20:16:35 WARN]:        at java.lang.Class.forName0(Native Method)
[20:16:35 WARN]:        at java.lang.Class.forName(Unknown Source)
[20:16:35 WARN]:        at me.test.kitpvp.Kitpvp.onEnable(Kitpvp.java:43)
[20:16:35 WARN]:        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264)
[20:16:35 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337)
(...)
[20:16:35 INFO]: Failed to load.
[20:16:35 WARN]: 74 [Server thread] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...

编辑

  • 添加 &lt;scope&gt;compile&lt;/scope&gt; 产生了相同的结果 - 无效。

【问题讨论】:

  • 你试过 complie 在 pom.xml 中的 postgres 依赖吗?
  • 我的 pom.xml 中的 @StijnLeenknegt compile 与没有它的结果相同 - 不过感谢您的快速响应。
  • 这使得 IntelliJ 的 Maven 选项卡中的 org.postgresql:postgresql:bundle:42.2.5 出现红线,错误为 Problems: Unresolved dependency: 'org.postgresql:postgresql:bundle:42.2.5' - 我不知道如何解决这个问题。

标签: java postgresql hikaricp


【解决方案1】:

您可以指定一个过滤器以将驱动程序工件包含在阴影 JAR 中:

<configuration>
   <minimizeJar>true</minimizeJar>
   <filters>
       <filter>
           <artifact>org.postgresql:postgresql</artifact>
           <includes>
               <include>**</include>
           </includes>
       </filter>
   </filters>

更多详情:Selecting Contents for Uber JAR

由于您的 POM 中的(未过滤的)&lt;minimizeJar&gt;true&lt;/minimizeJar&gt; 配置以及在编译时未使用驱动程序类这一事实而发生此问题。

maven-shade-plugin on minimizeJar:

当为 true 时,依赖项将在类级别被剥离到仅工件所需的传递外壳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2017-02-20
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多