移动包私有类 - 我应该认为二进制不兼容吗?

0__*_*0__ 8 scala binary-compatibility package-private migration-manager

由于auxWindows下的包名称存在问题,我正在我的库的包层次结构中移动一个帮助器类

de.sciss.scalainterpreter.aux
Run Code Online (Sandbox Code Playgroud)

de.sciss.scalainterpreter
Run Code Online (Sandbox Code Playgroud)

该类是图书馆私有的,即private[scalainterpreter] object Helper.

现在使用Typesafe Migration-Manager,显然它报告更改不兼容:

Found 2 binary incompatibiities
===============================
 * class de.sciss.scalainterpreter.aux.Helper does not have a correspondent
   in new version
 * object de.sciss.scalainterpreter.aux.Helper does not have a correspondent
   in new version
Run Code Online (Sandbox Code Playgroud)

但我怀疑如果客户端代码没有调用任何一个对象,那么接口仍然是兼容的,因此我可以使用次要版本增加来指示更改,并允许这两个版本可以互换使用.

正确?

som*_*ytt 1

很容易看出内联如何破坏客户端代码,因为内联代码本质上会渗透到客户端界面中。这个例子确实要求出现链接错误;我们可以尝试做一些事情,比如 javap | grep Helper,但在某种程度上你必须让 scalac 完成它的工作。

package lib {

  object Lib {
    //import util.Helper
    @inline def result = Helper.help
  }

  //package util {

  private [lib] object Helper {
    @inline def help = "Does this help?"
  }
//}
}
Run Code Online (Sandbox Code Playgroud)

无辜旁观的客户示例:

package client

object Test {
  import lib.Lib
  def main(args: Array[String]) {
    println(Lib.result)
  }
}
Run Code Online (Sandbox Code Playgroud)

更改包私有类的包:

$ scala -cp "classes;target" client.Test
Does this help?

apm@halyard ~/tmp/taking-it-private
$ vi lib.scala

apm@halyard ~/tmp/taking-it-private
$ rm -rf classes/*

apm@halyard ~/tmp/taking-it-private
$ smalac -d classes -optimise lib.scala 

apm@halyard ~/tmp/taking-it-private
$ smala -cp "classes;target" client.Test
java.lang.ClassNotFoundException: lib.util.Helper$
Run Code Online (Sandbox Code Playgroud)

Javap 展示了原因。[即,调用是内联的,但它仍然想要初始化模块。]

我没有关注这些讨论,但例如,有以下链接: https: //github.com/scala/scala/pull/1133 以及有关 ML 的其他讨论,了解关于二进制兼容性的期望是有效的。 https://groups.google.com/forum/?fromgroups=#!topic/scala-internals/sJ-xnWL_8PE