Scala 2.11.8集成Protobuf报错:对象Proto已定义、类重复定义
解决Scala 2.11.8集成Protobuf的类重复定义错误
嗨,我来帮你捋捋这个问题!你碰到的IngInfo is already defined as case class IngInfo错误,核心原因就是Protobuf插件重复生成了同一个Scala类,导致编译时类定义冲突——这也是你看到60个错误的根源,大概率是一系列重复类定义引发的连锁问题。下面是几个最可能的诱因和对应的解决办法:
1. 多个Protobuf插件冲突
如果你在build.sbt里同时引入了多个Protobuf相关插件(比如sbt-protobuf和scalapb),它们会各自独立生成Scala代码,很容易出现同一类被多次生成的情况。
解决步骤:
- 打开你的
build.sbt,只保留一个你实际需要使用的Protobuf插件,移除其他同类插件的依赖和配置。
2. 代码生成任务被重复触发
从日志里能看到两次Protoc target directory: /home/user/Git/tortle/target/src_managed/main,这说明Protobuf代码生成任务被执行了两次,两次生成的代码完全重叠,自然会出现类重复定义。
解决步骤:
- 先清理项目的目标目录,再重新编译,避免残留的旧生成代码干扰:
sbt clean compile - 检查
sbt的任务依赖配置,看看是不是compile任务被绑定了多次Protobuf生成逻辑,或者插件本身的配置导致重复执行。
3. .proto文件本身存在重复定义或导入问题
如果你的项目里有多个.proto文件定义了同名的IngInfo消息,或者某个.proto重复导入了包含IngInfo的文件,也会导致生成的Scala类重复。
解决步骤:
- 梳理所有
.proto文件的结构,确保同一个消息类型只在一个.proto文件中定义; - 检查
.proto的导入语句,避免循环导入或者重复导入同一个文件。
4. Scala版本与插件版本不兼容
你使用的Scala 2.11.8是比较旧的版本,有些新版本的Protobuf插件可能不再对其提供完整支持,导致代码生成逻辑异常,出现重复生成的情况。
解决步骤:
- 选择支持Scala 2.11的插件版本,比如使用
scalapb的话,推荐用0.10.x系列版本,在build.sbt中配置如下:libraryDependencies += "com.thesamet.scalapb" %% "scalapb-runtime" % "0.10.11" % "protobuf" addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.9.9") libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.10.11"
内容的提问来源于stack exchange,提问作者Laurie Ma
相关产品推荐
相关产品推荐

