You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至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之后的其他稳定版本,问题复现

期望解决方案方向

  1. 调整构建流程,让scalac编译前先执行注解处理器生成src_managed目录下的代码
  2. 配置scalac,使其忽略依赖QueryBuilder类的Java文件的检查

内容的提问来源于stack exchange,提问作者Joseph Fish Ludy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:53:14