如何将J2EE/Servlet Web应用迁移至Spring Boot?求迁移步骤
Servlet/J2EE 项目迁移至 Spring Boot 实操步骤
一、前期准备
- 梳理现有项目资产:列出所有Servlet、过滤器、监听器,以及依赖的J2EE组件(如EJB、JPA、JMS),整理外部配置项(数据库连接、资源文件路径等)。
- 匹配Spring Boot版本:根据项目当前JDK版本选择兼容的稳定版——JDK 8对应Spring Boot 2.x系列,JDK 17+对应Spring Boot 3.x系列。
二、依赖替换与重构
- 移除J2EE容器及API依赖:删除
javax.servlet-api、javax.ejb-api、javax.persistence-api等依赖,替换为Spring Boot Starter组件:- Web基础:引入
spring-boot-starter-web(内置Tomcat容器+Spring MVC,自动替代Servlet API) - 持久层:用
spring-boot-starter-data-jpa替换原生JPA依赖 - 消息队列:根据原组件选择
spring-boot-starter-artemis(ActiveMQ Artemis)或对应厂商starter
- Web基础:引入
- 启用Spring Boot依赖管理:在pom.xml中引入
spring-boot-dependencies作为父依赖,统一管控所有组件版本,避免依赖冲突。
三、核心代码改造
1. Servlet/过滤器/监听器迁移
- 快速适配方案:在Spring Boot启动类上添加
@ServletComponentScan注解,然后给原有Servlet类加@WebServlet、过滤器加@WebFilter、监听器加@WebListener,无需大幅修改原有业务代码。 - 自定义配置方案:通过
ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean在配置类中注册组件,适合需要自定义初始化参数、顺序的场景。
2. EJB 迁移
- 无状态会话Bean:替换
@Stateless为Spring的@Service或@Component,将@EJB依赖注入改为@Autowired。 - 有状态会话Bean:尽量重构为无状态组件;若必须保留状态,可使用
@Scope("session")标记,并通过Spring的会话管理替代EJB有状态机制。
3. JPA 适配
- 原有
EntityManager注入的@PersistenceContext注解可直接沿用。 - 推荐用Spring Data JPA的Repository接口简化DAO层:定义继承
JpaRepository的接口,自动实现CRUD操作,替代手写的DAO实现类。
4. 启动类创建
- 新建带
@SpringBootApplication注解的主类,作为项目入口:
@SpringBootApplication @ServletComponentScan // 如果用注解方式注册Servlet/过滤器/监听器 public class MigrationApplication { public static void main(String[] args) { SpringApplication.run(MigrationApplication.class, args); } }
四、配置文件迁移
- 移除XML配置:删除
web.xml、ejb-jar.xml、persistence.xml等传统J2EE配置文件,将配置项迁移至application.properties或application.yml:- 数据库配置示例:
spring.datasource.url=jdbc:mysql://localhost:3306/your_db spring.datasource.username=root spring.datasource.password=xxx spring.jpa.hibernate.ddl-auto=update- 容器配置:通过
server.port指定端口,server.servlet.context-path设置上下文路径
- 遗留XML兼容:若有未替换的Spring XML配置,可在启动类用
@ImportResource("classpath:legacy-spring.xml")引入,逐步替换为Java配置。
五、测试与部署
- 单元测试改造:用
@SpringBootTest注解编写测试类,Spring Boot自动加载应用上下文,替代原有JUnit测试的手动配置。 - 本地运行:直接启动主类的
main方法,或执行Maven命令mvn spring-boot:run,无需手动部署到外部容器。 - 打包部署:
- 可执行JAR(默认):执行
mvn package生成JAR包,直接用java -jar your-app.jar启动 - WAR包部署:若需部署到外部容器,修改启动类继承
SpringBootServletInitializer并重写configure方法,打包时指定<packaging>war</packaging>。
- 可执行JAR(默认):执行
六、注意事项
- 渐进式迁移:优先迁移核心业务模块,再逐步替换非核心功能,降低风险。
- 依赖冲突排查:用
mvn dependency:tree命令查看依赖树,排除冲突的J2EE遗留依赖。 - 日志统一:将原有
java.util.logging替换为Spring Boot默认的Logback,简化日志配置。
内容的提问来源于stack exchange,提问作者Susilkumar
相关产品推荐
相关产品推荐

