如何使用scalac命令编译Akka Actor源码开展Scala编译插件测试
基于原生scalac命令完成Akka Actor模块带插件编译的实操方案
直接裸跑scalac *.scala触发数千条报错是完全正常的现象,和开发的编译插件没有直接关系——Akka源码的复杂度、依赖规模、语法特性使用度远高于之前测试的两个自定义样例,必须补全编译必需的上下文、参数、依赖才能正常跑通。
具体操作按下面的步骤落地:
- 收集完整的源码编译集:不要只抓取单个根目录下的顶层scala文件,要递归遍历akka-actor模块下所有子目录的.scala源文件,把全部同模块的源码纳入编译范围,避免因为跨包引用、伴生对象找不到、内部类缺失触发类加载报错。如果用shell环境可以通过
find命令自动收集所有源文件路径,不要直接用非递归的*.scala通配符匹配,这是之前报错量爆炸的核心诱因。 - 配齐classpath依赖:Akka 2.6.10的actor模块不是零依赖可编译的,必须把编译所需的全部第三方jar包通过
-classpath参数传入,核心要包含: - 匹配Akka 2.6.10适配版本的Scala标准库、Scala反射库(对应Scala 2.13.x系列,不要错配Scala 2.12或3.x版本的依赖,会触发语法兼容问题)
- 模块编译期必需的外部依赖jar,包括配置解析库、日志门面适配库、协议序列化相关的依赖,全部按路径拼接到classpath参数里,类Unix系统用冒号分隔多路径,Windows系统用分号分隔。
- 补全编译必需的 scalac 参数:Akka源码使用了大量Scala高级语法特性,默认编译参数会触发语法不兼容报错,需要手动加上对应的语言开关:
-language:postfixOps:支持源码里的后置操作符写法-language:implicitConversions:支持源码里的自定义隐式转换逻辑-d ./target:指定编译输出目录,避免class文件散乱存放- 临时加
-nowarn可以压下非阻断的警告信息,减少排查核心报错的噪音 - 挂载编译插件:把开发的Test.jar插件和之前测自定义样例一样,通过
-Xplugin:Test.jar参数加入编译命令,有需要的话可以加-Xplugin-require:你的插件标识参数,避免插件被编译器静默跳过。
举个拼接完成的参考命令:
scalac \ -classpath "scala-library-2.13.10.jar:scala-reflect-2.13.10.jar:config-1.4.1.jar:slf4j-api-1.7.30.jar" \ -language:postfixOps -language:implicitConversions \ -nowarn \ -d ./target/akka-actor-compiled \ -Xplugin:Test.jar \ $(find ./akka-actor/src/main/scala -name "*.scala")
关键排查技巧:正式挂插件测试前,先跑一次去掉
-Xplugin:Test.jar参数的纯源码编译流程,等确认同参数下可以零核心报错完成源码编译后,再加回插件参数测试,这样可以把“源码依赖/参数不对导致的报错”和“插件逻辑导致的编译异常”完全隔离开,避免无意义的排查。
内容的提问来源于stack exchange,提问作者Mohsen Moradi
相关产品推荐
相关产品推荐

