Maven项目改造SpringBoot实战指南

发布时间:2026/7/22 1:54:45

Maven项目改造SpringBoot实战指南 1. 为什么要把Maven项目改造成SpringBoot去年接手维护一个老旧的Java Web项目时我深刻体会到了传统Maven项目的痛点。每次启动都要手动配置Tomcat依赖冲突排查动辄半天配置文件散落在src/main/resources的各个角落。当看到新同事用SpringBoot一键启动项目时我决定对老项目进行改造。SpringBoot本质上是对Spring框架的再封装它通过约定优于配置的原则解决了传统Java EE开发的几个核心痛点依赖管理混乱传统Maven项目需要手动管理大量Spring相关依赖及其版本而SpringBoot通过starter依赖提供开箱即用的依赖组合配置繁琐XML配置文件和Java Config混杂的情况在SpringBoot中通过application.yml/properties统一管理部署复杂不再需要外置Servlet容器内嵌Tomcat/Jetty让应用可以打包成可执行jar实际改造中发现不是所有Maven项目都适合改造成SpringBoot。如果项目重度依赖特定应用服务器特性如JNDI资源或需要精细控制Servlet容器参数保持传统架构可能更合适。2. 改造前的准备工作2.1 环境与工具确认我的改造环境如下JDK 1.8SpringBoot 2.x的推荐版本Maven 3.6.3需确认settings.xml配置了阿里云镜像IntelliJ IDEA 2021.3社区版足够关键工具链检查点# 检查Java和Maven版本 java -version mvn -v # 确认Maven镜像配置查看~/.m2/settings.xml mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror2.2 项目结构分析原Maven项目是标准的多模块结构old-project ├── pom.xml (父POM) ├── old-web (Web模块) │ ├── src/main/webapp/WEB-INF/web.xml │ └── pom.xml ├── old-service (业务逻辑模块) │ └── pom.xml └── old-dao (数据访问模块) └── pom.xml需要特别注意的改造点web.xml中的Servlet/Filter配置需要转换为SpringBoot的配置类JSP文件需要特殊处理SpringBoot官方推荐使用Thymeleaf静态资源位置需要调整到src/main/resources/static3. 核心改造步骤详解3.1 父POM的重构原父pom.xml的改造要点!-- 添加SpringBoot父POM -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.6.4/version relativePath/ /parent !-- 修改打包方式为jar -- packagingjar/packaging !-- 移除原有依赖管理改用SpringBoot starters -- dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 其他starter按需添加 -- /dependencies !-- 添加SpringBoot Maven插件 -- build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build3.2 主启动类的创建在原先的web模块中创建Application类SpringBootApplication public class OldProjectApplication { public static void main(String[] args) { // 移除原Servlet容器初始化代码 SpringApplication.run(OldProjectApplication.class, args); } // 将web.xml中的Filter转换为Bean Bean public FilterRegistrationBeanXssFilter xssFilter() { FilterRegistrationBeanXssFilter registration new FilterRegistrationBean(); registration.setFilter(new XssFilter()); registration.addUrlPatterns(/*); return registration; } }3.3 配置文件的迁移将原properties/XML配置转换为application.ymlspring: datasource: url: jdbc:mysql://localhost:3306/old_db username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mvc: view: prefix: /WEB-INF/views/ suffix: .jsp server: port: 8080 servlet: context-path: /old遇到的一个坑原项目使用Druid连接池需要在配置中显式指定type否则SpringBoot会默认使用Hikarispring.datasource.type: com.alibaba.druid.pool.DruidDataSource4. 特殊场景处理方案4.1 JSP支持的配置虽然SpringBoot不推荐JSP但老项目改造时可能需要保留// 在主配置类添加 Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver new InternalResourceViewResolver(); resolver.setPrefix(/WEB-INF/views/); resolver.setSuffix(.jsp); return resolver; }同时需要添加依赖dependency groupIdorg.apache.tomcat.embed/groupId artifactIdtomcat-embed-jasper/artifactId scopeprovided/scope /dependency4.2 静态资源处理原项目静态资源在webapp/resources下需要移动资源到src/main/resources/static或者添加配置spring: web: resources: static-locations: classpath:/static/, file:${project.basedir}/src/main/webapp/resources/4.3 多数据源配置老项目常有多数据源改造示例Configuration public class DataSourceConfig { Primary Bean(name primaryDataSource) ConfigurationProperties(prefix spring.datasource.primary) public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } Bean(name secondaryDataSource) ConfigurationProperties(prefix spring.datasource.secondary) public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } }5. 改造后的验证与优化5.1 启动验证清单检查启动日志是否有异常访问http://localhost:8080/actuator/health验证基本状态关键接口的冒烟测试JSP页面渲染检查静态资源加载测试5.2 性能优化建议开启JVM参数优化java -jar -Xms512m -Xmx1024m -XX:MetaspaceSize128m old-project.jar添加监控依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency使用SpringBoot的缓存抽象改造原有缓存逻辑Cacheable(value users, key #userId) public User getUserById(Long userId) { // ... }6. 改造过程中的经验总结依赖冲突排查使用mvn dependency:tree查看依赖树特别注意老项目中可能存在的低版本依赖配置迁移技巧不要一次性迁移所有配置应该按功能模块逐步验证启动失败排查常见的ClassNotFound问题往往是因为依赖scope设置错误渐进式改造对于大型项目可以采用新老并存的方式逐步迁移文档同步更新记得更新README中的启动说明删除原来关于Tomcat配置的部分改造完成后项目的启动时间从原来的1分钟缩短到15秒开发体验得到质的提升。但也要注意SpringBoot不是银弹对于特别古老的项目如Struts2完整的改造可能需要更周密的计划。

相关新闻