Spring Boot项目Maven打包排除依赖配置与主类找不到问题
解决Spring Boot Maven瘦包打包后找不到主函数问题
问题根源
你现在只配置了maven-dependency-plugin把依赖复制到lib目录,但没给生成的JAR指定主类入口,而且Spring Boot默认的spring-boot-maven-plugin会自动生成包含所有依赖的可执行JAR,直接覆盖了你要的“瘦JAR”,导致执行java -jar时找不到主函数。
完整配置方案
1. 保留现有依赖复制配置
你的maven-dependency-plugin配置没问题,继续保留,确保打包时把依赖都复制到target/lib:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin>
2. 配置maven-jar-plugin生成带主类的瘦JAR
添加这个插件,专门生成只包含项目自身代码的JAR,同时在JAR的MANIFEST.MF里写上主类和依赖路径:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <!-- 替换成你自己的Spring Boot主类全路径,比如com.example.DemoApplication --> <mainClass>com.example.YourSpringBootApplication</mainClass> <!-- 自动把lib目录下的所有依赖加到类路径 --> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> <!-- 排除所有依赖,只打包自己的代码 --> <excludes> <exclude>**/*.jar</exclude> </excludes> </configuration> </plugin>
3. 禁用spring-boot-maven-plugin的自动重打包
如果你的pom里有spring-boot-maven-plugin,它默认会在打包阶段生成带全依赖的JAR,覆盖我们的瘦JAR。必须禁用它的repackage功能:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> <!-- 跳过自动重打包 --> <configuration> <skip>true</skip> </configuration> </execution> </executions> <!-- 保留主类配置,保证Spring Boot注解正常编译 --> <configuration> <mainClass>com.example.YourSpringBootApplication</mainClass> </configuration> </plugin>
正确启动方式
打包完成后,target目录下会有你的项目JAR(比如demo-1.0.0.jar)和lib文件夹,用以下命令启动:
方式1:直接用jar启动(推荐)
因为我们已经在MANIFEST.MF里配置了类路径,直接执行:
java -jar target/demo-1.0.0.jar
方式2:用-djava.ext.dirs指定依赖目录
如果必须用这个参数,注意要同时包含系统默认的扩展目录和你的lib目录(Windows用;分隔,Linux/macOS用:):
# Linux/macOS java -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:target/lib -jar target/demo-1.0.0.jar # Windows java -Djava.ext.dirs=%JAVA_HOME%\jre\lib\ext;target\lib -jar target/demo-1.0.0.jar
检查要点
- 一定要把配置里的
com.example.YourSpringBootApplication换成你实际的主类全路径。 - 打包后打开JAR里的
META-INF/MANIFEST.MF,确认Main-Class和Class-Path这两个属性是否正确。
内容的提问来源于stack exchange,提问作者Kevin Peng
相关产品推荐
相关产品推荐

