maven-assembly-plugin打fat jar后bat启动报META-INF/spring.factories错误
问题解决方案
该报错核心是fat jar内的META-INF/spring.factories文件缺失Spring Boot自动配置相关条目,Eclipse正常启动是因为运行时依赖直接加载各个独立jar包的配置,不会出现文件覆盖问题,问题出在maven-assembly-plugin的打包逻辑上。
方案1:替换为Spring官方打包插件(推荐)
maven-assembly-plugin默认会直接合并同名文件,后续同路径的文件会覆盖之前的内容,无法正确处理Spring Boot多个依赖包中同名的spring.factories、spring.handlers等配置文件。官方提供的spring-boot-maven-plugin会自动处理这类配置合并,且生成的fat jar结构符合Spring Boot的启动规范。
配置示例如下,添加到pom.xml中:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>匹配你的Spring Boot版本</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <!-- 指定你的启动类全限定名,比如com.xxx.Application --> <mainClass>com.xxx.YourMainClass</mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,target目录生成的可执行jar即可直接用java -jar启动。
方案2:调整maven-assembly-plugin配置(必须用assembly插件时使用)
需要在assembly的描述文件中添加配置,对Spring相关的配置文件执行追加合并而非覆盖:
- 修改assembly的xml配置文件,添加如下文件合并规则:
<containerDescriptorHandlers> <containerDescriptorHandler> <handlerName>metaInf-services</handlerName> </containerDescriptorHandler> <containerDescriptorHandler> <handlerName>spring</handlerName> </containerDescriptorHandler> </containerDescriptorHandlers>
- 重新执行
mvn clean install生成fat jar即可。
额外检查项
- 确认bat脚本中指定的jar路径为fat jar,而非不带依赖的普通jar,可以在bat中添加
echo %你的jar路径变量%打印路径校验 - 检查bat中
JAVA_HOME对应的JDK版本和项目编译版本一致,避免版本不兼容导致的配置加载失败 - 打包完成后可手动打开fat jar,检查
META-INF/spring.factories文件中是否存在org.springframework.boot.autoconfigure.EnableAutoConfiguration相关配置条目
内容的提问来源于stack exchange,提问作者JustQuest
相关产品推荐
相关产品推荐

