我如何修复scala-library.jar中的错误

时间:2014-01-06 19:20:33

标签: scala playframework-2.2 serialversionuid

我正在建立一个游戏!使用Play的框架应用! 2.2.1,sbt 0.13.0,我的本地版本的scala是2.10.3。

在反序列化我从同事继承的特定文件时遇到了一个serialVersionUID问题来处理这个项目(我不知道是谁创建了这个序列化文件(或什么时候))。

我的错误讯息,在Play!中构建时:

Caused by: java.io.InvalidClassException: scala.collection.mutable.WrappedArray$ofRef; local class incompatible: stream classdesc serialVersionUID = 8184381945838716286, local class serialVersionUID = -8707880168089396949

经过多次搜索,我发现这个补丁应该修复错误SI-5046:

https://issues.scala-lang.org/browse/SI-5046

我从github为分支2.10.x下载了scala源代码,我在这里将补丁应用到WrappedArray.scala:scala / src / library / scala / collection / mutable / WrappedArray.scala

如何处理此修改过的源代码,以便我可以在Play中使用它!应用

* 编辑#1:

我按照@Alexey Romanov的链接

当我编译Play时,我仍然收到有关WrappedArray $ ofRef的错误消息,尽管现在它是一个不同的错误消息。这是我做的:

我使用ant重建了scala发行版:

ant build

ant partialdist

然后在Play!我通过将以下内容添加到我的Build.scala文件中来指定用于SBT和插件的scala版本:

scalaVersion := "2.10.3" autoScalaLibrary := false scalaHome := Some(file("/path_to_my_rebuilt_scala_distribution"))

现在我的错误信息是:

Caused by: java.io.InvalidClassException: scala.collection.mutable.WrappedArray$ofRef; incompatible types for field bitmap$0

编辑#2:

我正在向下移动Scala版本,当我到达2.9.2时,通过应用补丁修复了有关WrappedArray $ ofRef的错误。现在我收到另一个类的另一个序列化错误:

java.io.InvalidClassException: scala.Symbol; local class incompatible: stream classdesc serialVersionUID = -3681772905693662441, local class serialVersionUID = 7747205442425187939

我将转到Scala 2.9.1,看看我是否可以使用该版本获取该文件的内容。

* 编辑#3:

在scala版本2.9.1-1中,我收到了不同的序列化错误: java.io.InvalidClassException: scala.Tuple2; local class incompatible: stream classdesc serialVersionUID = 3990034604647285925, local class serialVersionUID = 5867822941721784448

不知道接下来要尝试什么...继续下去scala版本,还是有其他建议?

1 个答案:

答案 0 :(得分:1)

To use a local Scala installation for building a project 定义scalaHome

scalaHome := Some(file("/path/to/scala/home/"))

如果您最终还要重建Play,请参阅How can I change version of Scala that is used by Play, SBT and its plugins?

编辑:我实际看了一下bug描述。看起来补丁将允许序列化/反序列化由两个不同的Scala版本创建的WrappedArray,这两个版本都包含此补丁。从那以后

  

(我不知道是谁创建了这个序列化文件(或何时))

它可能不适合你。从新的错误消息判断,可能是Scala的版本被序列化,只是没有包含字段2.10.3,并且无法反序列化。我最好的建议是尝试使用不同的Scala版本进行反序列化(可能不是2.10。*,因为它们是二进制兼容的),看看哪个版本有效。