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
相关产品推荐
相关产品推荐

