升级至Scala 3后Scala/Java混合项目managedSourceDirectories编译顺序异常
升级Scala到3.3.3后注解处理器生成代码导致编译失败问题
环境与问题概述
- 运行环境:Play 3.0.5,Java 21.0.4,sbt 1.10.3
- 现象:Scala 2.13.14环境下执行
sbt clean compile可正常编译;切换至Scala 3.3.3后出现scalac编译错误 - 核心矛盾:自定义注解处理器生成的查询类未被正确生成,导致Java文件找不到依赖
构建配置与注解处理器说明
build.sbt相关配置
Compile / compile := (Compile / compile dependsOn Def.task({ (Compile / managedSourceDirectories).value.head.mkdirs() })).value, Compile / javacOptions ++= Seq("-s", (Compile / managedSourceDirectories).value.head.getAbsolutePath)
Carbide注解处理器信息
- 独立Maven项目打包的jar,放置于app/lib目录
- 功能:扫描带有*@Entity*注解的实体类,通过反射生成关联的DAO查询方法,输出至
target/scala-3.3.3/src_managed/main/目录
错误详情
- Scala 3.3.3下
target/scala-3.3.3/src_managed/main/目录被创建但为空,javac编译环节未触发 - 编译错误日志:
[error] -- [E008] Not Found Error:.../DefaultCompetitionYearResource.java:8:39 [error] 8 |import shared.models.core.querybuilder.CompetitionYearQueryBuilder; [error] | ^ [error] | value querybuilder is not a member of shared.models.core
- 根本原因:Scala 3.3.3的scalac在注解处理器生成代码前就扫描了Java文件;由于Scala与Java代码存在相互依赖(如Scala路由与Java代码交互),必须保留
compileOrder := CompileOrder.Mixed配置
Scala 2.13.14下的正常编译流程
编译日志片段显示正确执行顺序:
[debug] Scala compilation took 2.762843833 s [debug] Attempting to call com.sun.tools.javac.api.JavacTool@2137f8f8 directly... [info] Annotation processing is enabled because one or more processors were found [querybuilders are put into src_managed dir] [info] Carbide warning: Unknown type: com.fasterxml.jackson.databind.JsonNode - skipping field: MasterSurveySchedule.template [These warnings are expected and okay] [info] Carbide warning: Unknown type: byte[] - skipping field: ResourceBlob.resourceFile [info] /Users/jludy/shared/app/shared/models/core/UnitTagGroup.java: Recompile with -Xlint:unchecked for details. [debug] Java compilation took 11.978637459 s [debug] [zinc] classfile.Parser parsing shared.models.core.querybuilder.support.DefaultAccountResolutionTypeQueryBuilderNode [classfile.Parser then looks at all our java classses] .... [debug] Java compilation + analysis took 14.683763333 s [debug] done compiling [debug] Registering generated classes: [debug] SsoRequireSetting$2.class [debug] Exceptions$FillRecursionException.class [Then the rest are registered] ....
- 正常执行顺序:Scala编译完成 → 注解处理器生成代码 → Java编译执行
已尝试的无效方案
- 切换
compileOrder为JavaThenScala或ScalaThenJava,因Scala与Java代码相互依赖无法生效 - 升级至Scala 3.3.0之后的其他稳定版本,问题复现
期望解决方案方向
- 调整构建流程,让scalac编译前先执行注解处理器生成
src_managed目录下的代码 - 配置scalac,使其忽略依赖QueryBuilder类的Java文件的检查
内容的提问来源于stack exchange,提问作者Joseph Fish Ludy
相关产品推荐
相关产品推荐

