Intellij+Bazel编译Java头文件时@CrossOrigin注解报错问题咨询
1. --output_groups=intellij-resolve-java-direct-deps 标志的作用
这个是IntelliJ Bazel插件同步项目时专用的编译标记,作用是:
- 触发IntelliJ专属的编译Aspect,仅生成IDE做代码解析、补全、跳转需要的直接依赖元数据,不需要完成完整的项目构建流程
- 仅编译Java头Jar(hjar,只包含类、方法、字段的签名信息,不含具体实现),大幅提升项目同步的速度,不用完整编译全量依赖树
2. <clinit>报错相关说明
<clinit>的含义
<clinit>是Java编译器自动生成的类静态初始化方法的固定名称,用于执行类静态变量赋值、静态代码块逻辑,业务代码不会直接声明或调用该方法。
报错实际原因
这个报错是Bazel用来生成Java头Jar的Turbine工具的已知兼容性Bug,和你的代码无关:
- Turbine解析Spring
@CrossOrigin这类带默认属性值的注解时,没有正确处理注解属性默认值的初始化逻辑,错误抛出“缺失必填参数”的异常,还误将底层的<clinit>方法名作为缺失参数暴露出来 - 常规构建不会触发Turbine生成头Jar的流程,所以不会出现该报错
修复方案
你可以选任意一种方式解决该问题:
- 关闭IntelliJ Bazel插件中「同步时使用头Jar优化」的功能,即可正常同步
- 给
@CrossOrigin添加任意显式参数,例如@CrossOrigin(origins = "*")即可绕开该Bug - 升级Bazel版本和IntelliJ Bazel插件到最新正式版,该兼容性问题已在后续版本修复
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

