【问题标题】:how do I know if these two versions of scala are exactly the same?我怎么知道这两个版本的 scala 是否完全相同?
【发布时间】:2014-01-30 00:47:22
【问题描述】:

我有两个来自 Scala-Lang 网站的 scala 版本 2.9.2 的不同副本。

没有。 1为二进制码:scala-2.9.2.tgz

没有。 2是源代码:scala-sources-2.9.2.tgz

我从源代码构建了 scala。我尝试在应用程序和二进制文件中同时使用,但编译的源代码没有。

我的用例:我正在编译我编写的一个小 scala 文件(参见下面的示例),然后创建一个 jar,然后在命令行上从该 jar 中运行“main”。要制作那个 jar,我必须在类路径中包含“scala-library.jar”(from this SO answer)。我需要能够使用我构建的 scala-sources,以便以后可以修改源代码。

当我使用编译后的源代码时,我收到关于 serialVersionUID 的错误,而二进制代码不会导致此问题。

确切的错误消息(使用我从源代码构建的 scala 时):

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

我为反序列化文件而运行的示例代码:

object test {
    def main(args: Array[String]) {
        var infile = args(0)
        val thing1 : MyClass = withObjectInput(infile) { 
          f => f.readObject().asInstanceOf[MyClass] 
        }
    }    
}

【问题讨论】:

    标签: scala scala-collections scala-2.9


    【解决方案1】:

    如果MyClass 没有明确提供serialVersionUID,编译器会生成一个。这对于编译时使用的不同版本的javac会有所不同。

    所以这个错误是由于你用于编译 scala-library 的 javac 版本和用于下载二进制文件的版本不匹配造成的。

    【讨论】:

    • 有什么方法可以查出他们编译二进制文件时使用了哪个版本的 javac?
    • 这是错误的做法。如果您正在序列化,那么您应该使用 @SerialVersionUID(value) 注释您的类
    • serialVersionUID 问题来自 WrappedArray 中的 scala-library(请参阅原始帖子上的错误消息)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2017-01-31
    • 2011-05-16
    相关资源
    最近更新 更多