配置Bazel+Scala时找不到主类io.baku.sbzcp.Main的问题求助
我来帮你搞定这个问题!你遇到的Could not find or load main class错误,核心原因是Scala文件的实际目录结构和包声明不匹配,导致Bazel编译后生成的类文件路径和你指定的main_class对不上。
问题根源
当你把文件移到scala目录并去掉包声明时,类的包名是空,文件位置和类名直接对应,所以Bazel能正确找到主类。但一旦加上包名io.baku.sbzcp,就必须保证文件的目录结构和包名完全一致,否则编译后的类文件路径会和main_class指定的不匹配,自然找不到。
具体解决方案
1. 调整目录结构匹配包名
你的主类是io.baku.sbzcp.Main,那么Scala文件必须放在如下路径:
app/io/baku/sbzcp/Main.scala
而不是直接放在app/Main.scala下。这样Bazel编译时会根据目录结构,把类文件生成到对应的io/baku/sbzcp路径下,和你main_class指定的完全对应。
2. 验证BUILD文件配置
你当前的BUILD文件配置是没问题的:
load("@io_bazel_rules_scala//scala:scala.bzl", "scala_binary") scala_binary( name = "Main", srcs = glob(["app/**/*.scala"]), main_class = "io.baku.sbzcp.Main", visibility = ["//visibility:public"] )
只要目录结构调整正确,glob(["app/**/*.scala"])会正确抓取所有符合包结构的源文件。
3. 可选:使用标准项目布局
如果你习惯用SBT/Maven风格的目录结构,可以把源文件移到src/main/scala/io/baku/sbzcp/Main.scala,然后修改BUILD文件的srcs配置:
scala_binary( name = "Main", srcs = glob(["src/main/scala/**/*.scala"]), main_class = "io.baku.sbzcp.Main", visibility = ["//visibility:public"] )
这种布局更符合Java/Scala项目的常规规范,也能让Bazel的Scala规则更顺畅地识别包结构。
4. 调试小技巧(可选)
如果调整后还是有问题,可以先执行编译命令:
bazel build //:Main
然后查找编译后的类文件位置:
find bazel-bin -name "Main.class"
正常情况下,路径应该是bazel-bin/io/baku/sbzcp/Main.class。如果路径不对,说明你的目录结构和包名依然不匹配,需要再检查调整。
内容的提问来源于stack exchange,提问作者FrancMo

