Spring Boot 2与Velocity、Lombok及注解处理器兼容问题
这是Spring Boot版本升级中很常见的踩坑点,我来帮你捋一捋背后的原因和解决方向:
先明确:Spring Boot 2并没有完全禁用Velocity
首先纠正一个误区:Spring Boot 2只是移除了对Velocity作为MVC视图模板的官方支持(比如不再提供spring-boot-starter-velocity起步依赖),但这并不影响你用Velocity做代码生成(比如注解处理器里加载.vm模板)。所以直接原因不是“Spring Boot 2不支持Velocity”,而是升级过程中出现了依赖或配置的断层。
可能的核心原因
1. 依赖传递丢失
Spring Boot 1的依赖管理中默认包含了Velocity的相关依赖,但Spring Boot 2彻底移除了这块的自动依赖引入。升级后如果没有手动声明Velocity依赖,你的注解处理器在编译阶段会找不到Velocity的核心类(比如VelocityEngine),自然无法加载.vm模板生成类。
2. 注解处理器的类路径配置错误
Spring Boot 2对编译阶段的注解处理器类路径处理做了调整:
- 如果你之前把Velocity依赖放在
compile或providedscope下,在Spring Boot 2的编译环境中,注解处理器可能无法访问到这些依赖; - 需要显式将Velocity依赖标记为
annotationProcessorscope,确保编译时处理器能加载到它。
3. JDK兼容性问题
Spring Boot 2最低支持Java 8,但很多项目升级后会切换到更高版本(比如Java 11+)。而Velocity 1.7是比较老的版本,在高JDK环境下可能存在反射API、类加载机制的兼容性问题,导致模板加载或渲染失败。
4. 模板文件加载路径变化
Spring Boot 2对资源文件的加载规则有微调,比如.vm模板如果放在非标准路径下,注解处理器的ClassLoader可能无法正确读取到这些模板文件,导致生成逻辑中断。
针对性解决步骤
1. 手动添加Velocity依赖
在你的构建文件中显式声明Velocity 1.7的依赖,并配置正确的scope:
Maven示例:
<dependencies> <!-- 供注解处理器编译时使用 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> <scope>annotationProcessor</scope> </dependency> <!-- 供编译时语法检查使用 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> <scope>compileOnly</scope> </dependency> </dependencies>
Gradle示例:
dependencies { annotationProcessor 'org.apache.velocity:velocity:1.7' compileOnly 'org.apache.velocity:velocity:1.7' }
2. 验证注解处理器的注册配置
确保你的自定义注解处理器被正确注册:
- 检查
src/main/resources/META-INF/services/javax.annotation.processing.Processor文件,里面是否包含你的处理器全类名; - 如果用Maven编译插件,可以显式指定处理器:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <annotationProcessors> <annotationProcessor>com.yourpackage.YourCustomProcessor</annotationProcessor> </annotationProcessors> </configuration> </plugin> </plugins> </build>
3. 排查模板加载逻辑
- 确认
.vm模板文件放在src/main/resources下的正确路径(比如templates/generator/); - 在注解处理器中,用
Thread.currentThread().getContextClassLoader().getResourceAsStream()来加载模板,避免使用相对路径导致的加载失败。
4. 兼容性适配
如果项目用了Java 9+,可以尝试:
- 给Velocity添加模块兼容参数(在编译插件中加入
--add-modules java.xml.bind等); - 考虑升级到Velocity 2.x版本,它对高JDK的支持更好,API和1.7差异不大,迁移成本低。
内容的提问来源于stack exchange,提问作者user11750232

