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

Spring项目生成可执行Jar失败,报BeanDefinitionParsingException错误

解决Spring项目打包Jar后运行出现BeanDefinitionParsingException的问题

嘿,我之前也踩过这个坑!你这个问题的核心原因是Maven打包时没有正确处理Spring命名空间所需的依赖和资源文件——毕竟IDE运行时会自动帮你把所有依赖都加载齐全,但打包成可执行Jar的时候,很容易出现资源文件被覆盖或者依赖缺失的情况。下面给你几个针对性的解决方案:

1. 检查并调整Maven打包插件配置

这是最常见的问题根源,不同类型的Spring项目需要用不同的打包插件:

如果是普通Spring项目(非Spring Boot)

推荐使用maven-shade-plugin,它能解决多个Spring依赖Jar中META-INF/spring.handlers和META-INF/spring.schemas文件被互相覆盖的问题(这两个文件包含了Spring命名空间的处理器映射,缺失或不完整就会报找不到NamespaceHandler的错误)。在你的pom.xml中添加如下配置:

<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>
                            <!-- 合并所有依赖中的spring.handlers文件 -->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <!-- 合并所有依赖中的spring.schemas文件 -->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                            <!-- 指定你的主类路径 -->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.yourpackage.YourMainApplicationClass</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

如果是Spring Boot项目

直接使用官方的spring-boot-maven-plugin即可,它会自动处理依赖打包和资源文件合并的问题,配置示例:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.7.15</version> <!-- 替换为你项目使用的Spring Boot版本 -->
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>com.yourpackage.YourSpringBootMainClass</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

2. 确认Spring相关依赖的完整性和一致性

检查你的pom.xml,确保所有Spring相关依赖(比如spring-context、spring-beans、spring-data-mongodb等)的版本一致,没有冲突,并且都正确引入了。比如如果用到MongoDB的Spring命名空间,spring-data-mongodb依赖必须存在:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>3.3.4</version> <!-- 与你的Spring版本匹配 -->
</dependency>

3. 验证打包后的Jar内容

打包完成后,可以解压Jar文件,检查META-INF目录下的spring.handlers和spring.schemas文件,确认里面包含MongoDB命名空间对应的配置项,比如:

  • 在spring.handlers中应该有类似http\://www.springframework.org/schema/data/mongo=org.springframework.data.mongodb.config.MongoNamespaceHandler的条目
  • 在spring.schemas中应该有类似http\://www.springframework.org/schema/data/mongo/spring-mongo.xsd=org/springframework/data/mongodb/config/spring-mongo.xsd的条目

如果这些条目缺失,说明打包时没有正确合并资源文件,回到第一步调整插件配置即可。

重新执行mvn clean package,然后用java -jar your-project.jar运行,应该就能解决这个问题了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:33:09