我有一个在Scala 2.11下工作的项目,我正在升级它以使用Scala 2.12。当我通过命令行在sbt上运行它时,我的单元测试失败了,但是当我通过IntelliJ IDEA运行它时,它运行正常。
我得到的错误是:
java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V
测试是Java中的JUnit测试,它调用用Scala编写的代码。
单元测试中的违规行:
String paramsJson = adapter.sendReadyMessage();
sendReadyMessage
方法(也是Java)尝试创建ReadyMessage
:
ReadyMessage rm = new ReadyMessage(timestamp);
ReadyMessage
只是一个Scala案例类
case class ReadyMessage(Timestamp: String) extends ToJson
ToJson
是一个提升JSON帮助特征,它封装了JSON生成:
import net.liftweb.json.{DefaultFormats, Serialization}
trait ToJson {
private implicit val formats = DefaultFormats
def toJson = Serialization.write(this)
}
错误似乎发生在case class ReadyMessage
行。 ToJson
块用于上下文。
就像我说的那样,当我从IntelliJ中运行它时,它会起作用。我在sbt下运行时失败了。当它是sbt中的整批测试的一部分时失败,并且当我在sbt中自己运行它时失败。
如果没有粘贴我的整个build.sbt文件,我不确定此处包含哪些其他可能有用的信息。这似乎是某种版本冲突,但我经历并更新了我能找到的所有软件版本号。
我意识到这个问题涉及的问题可能比通过SO合理调试更复杂。但即使是“确保你在build.sbt中更新了XX”的回复也是有帮助的。
答案 0 :(得分:2)
答案结果与问题本身一样烦人。
经过几个小时的搜索我的构建后,我意识到子项目中有一个“lib”目录失败了。我打开它,果然,它包含旧版本的Scala和其他一些库。我删除了那些,确保libraryDependencies处理它们,现在一切都构建和测试就好了。
感谢大家让我加入“这是Scala版本不匹配”的列车。孩子们,这是一个警示故事。根据自己的风险混合托管和非托管依赖项。