应用程序可以使用已开发的较低scala版本的依赖库吗?

0 scala sbt

我正在将应用程序升级到 scala 版本 2.12。该应用程序使用的是另一个团队在 scala 2.11 中开发的库。

这是我更新的文件 build.sbt 代码。它使用库“sdp-commons-monitoring_2.11”

import com.typesafe.sbt.SbtNativePackager.autoImport.NativePackagerHelper._
import sbt.{Artifact, Credentials, Defaults, Level, addArtifact}

lazy val commonSettings = Seq(
  scalaVersion := "2.12.15",
  organization := "com.pi.isg.ingest"
)

name := "ingest-tool"

libraryDependencies += "com.pi.isg.sdp-commons" % "sdp-commons-monitoring_2.11" % "11.1.9" excludeAll(
  ExclusionRule(organization = "org.json4s"),
  ExclusionRule(organization = "org.scala-lang"),
  ExclusionRule(organization = "io.spray"),
  ExclusionRule(organization = "org.slf4j"),
  ExclusionRule(organization = "ch.qos.logback"),
  ExclusionRule(organization = "com.amazonaws"),
  ExclusionRule(organization = "com.typesafe.akka"),
  ExclusionRule(organization = "com.fieldstreams.dispatcher"),
  ExclusionRule(organization = "com.pi.fieldstreams.persistence"),
  ExclusionRule(organization = "com.pi.isg.sdp-commons", name = "sdp-commons-common-persistence_2.11"),
  ExclusionRule(organization = "com.pi.isg.sdp-commons", name = "sdp-commons-serialization_2.11")
)
Run Code Online (Sandbox Code Playgroud)

运行应用程序时,它抛出错误“java.lang.NoClassDefFoundError:scala/Product$class sbt.ForkMain$ForkError:java.lang.NoClassDefFoundError:scala/Product$class”。看来是兼容性版本问题。有什么方法可以在 build.sbt 中进行配置,以便我的应用程序使用 scala 版本 2.12 运行,而 lib 则使用 scala 版本 2.11 运行?

目前,开发该库的团队还没有计划将其库升级到新版本。

问候,

Gaë*_*l J 5

正如评论中提到的:Scala 2 次要版本(其中“次要”用于一般 semver 含义:)major.minor.patch不是二进制兼容的

因此,例如,使用 Scala 2.11 编译的库不能在 Scala 2.12 项目中使用。


Scala 3 开始改变这种情况:

  • 使用 Scala 2.13 编译的库可以在 Scala 3 项目中使用,反之亦然,但使用宏的库除外
  • Scala 3 次要版本是向后二进制兼容的(3.1 项目可以使用 3.0 库,但还不能使用相反的库,尽管这种情况正在逐步改变,并且未来可能会向前兼容)。

请参阅有关此的更多文档:

  • **Scala 2** 不遵循 semver,第二个数字称为major,第一个数字称为epic。 (2认同)