0

我对斯卡拉很陌生。在将多模块项目升级到 Scala 2.13 时,我发现在 Scala 2.12 中编译的这个依赖项class not found在运行时抛出异常

java.lang.NoClassDefFoundError: scala/collection/mutable/ArrayOps$ofRef

这个类在 2.13 中被移除。它仅在2.12之前可用。我正在寻找一种强制 v2.12编译此依赖项的方法。

我尝试使用交叉构建,但这不适用于核心库,因为使用以下构造的依赖项 url:

"org.scala-lang" % "scala-library" % scalaVersion.value

好像

https://repo1.maven.org/maven2/org/scala-lang/scala-library_2.12.15/2.12.15/scala-library_2.12.15-2.12.15.pom

此外,交叉构建似乎是允许使用其兼容的依赖版本编译具有不同 scala 版本的子模块的方式,而不是用于在单个依赖项上强制执行 scala 版本。

编辑 1: 这是构建定义:

   root
    |
    main
    |---dependency w/o 2.13 build
    |
    acceptanceTests
    |---dependency w/o 2.13 build
    |
    (other modules)

该依赖项是一个内部公共库。这在编译时使用类scala/collection/mutable/ArrayOps 。scala-lang -> scala-library

我的问题

  1. 甚至有可能做到这一点吗?或者是我这里提到的降级到 2.12 的唯一选择
  2. 为什么“核心”库不遵循外部库的 url 模式,例如: [organisation]/[module](_[scalaVersion])(_[sbtVersion])/[revision]. `相反,它看起来像https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.15/scala-library-2.12.15.pom
4

1 回答 1

0

你可以做这样的事情:

libraryDependencies ++= {
  CrossVersion.partialVersion(Keys.scalaVersion.value) match {
    case Some((2, 12)) => Seq(
      "com.typesafe.play" %% "play-json"  % "2.6.13"
    )
    case Some((2, 11)) => Seq( 
      "com.typesafe.play" %% "play-json" % "2.5.18"
    )
    case _ => Seq (
      "com.typesafe.play" %% "play-json" % "2.4.11"
    )
  }
}
于 2022-02-17T19:34:08.913 回答