You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven项目终端运行报java.lang.ClassNotFoundException: org.postgresql.Driver

解决Maven项目jar包运行找不到PostgreSQL驱动的问题

问题根源很明确:你用maven-jar-plugin生成的jar包只包含项目自身的编译代码,不会自动打包第三方依赖(比如PostgreSQL驱动)。IntelliJ能正常运行是因为它会自动把所有依赖加入类路径,但直接用java -jar运行时,JVM只会加载当前jar内的类,自然找不到外部依赖的驱动类。

给你三种实用的解决方法:

方法1:用maven-assembly-plugin打包含所有依赖的胖包

在pom.xml中添加以下插件配置:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.6.0</version>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
          <manifest>
            <!-- 替换成你的主类全路径 -->
            <mainClass>com.yourpackage.YourMainClass</mainClass>
          </manifest>
        </archive>
      </configuration>
      <executions>
        <execution>
          <id>make-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

执行打包命令:

mvn clean package assembly:single

打包完成后,target目录会生成一个带-jar-with-dependencies后缀的jar包,直接用java -jar运行这个包即可。

方法2:用maven-shade-plugin打胖包(更推荐)

shade插件比assembly更灵活,还能处理依赖冲突,配置如下:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.4.1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <!-- 替换成你的主类全路径 -->
                <mainClass>com.yourpackage.YourMainClass</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

执行打包命令:

mvn clean package

生成的jar包就是包含所有依赖的可执行包,直接运行即可。

方法3:手动指定类路径运行(不打胖包)

如果不想打包依赖,可以先把所有依赖复制到指定目录,比如target/lib,然后用-cp参数指定类路径:

# Linux/macOS用冒号分隔
java -cp "target/posthogdata-1.0-SNAPSHOT.jar:target/lib/*" com.yourpackage.YourMainClass

# Windows用分号分隔
java -cp "target/posthogdata-1.0-SNAPSHOT.jar;target/lib/*" com.yourpackage.YourMainClass

要实现自动复制依赖到lib目录,可以在pom.xml中添加maven-dependency-plugin配置:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>3.6.0</version>
      <executions>
        <execution>
          <id>copy-dependencies</id>
          <phase>package</phase>
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

执行mvn clean package后,依赖会自动复制到target/lib。

另外提一句:如果你的JDBC版本是4.0及以上(PostgreSQL驱动jar基本都满足),其实可以去掉Class.forName("org.postgresql.Driver");这句代码,JVM会自动加载META-INF/services里的驱动类,能避免这类手动加载的问题。

内容的提问来源于stack exchange,提问作者ASR4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:30:54