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

Can app use a dependency lib which has been developed lower scala version?

我正在将应用程序升级到 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")
)

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

目前开发lib的团队还没有升级lib的计划

此致,

如评论中所述: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 库,但还不能相反,尽管这正在逐步改变并且在未来)。

查看有关此的更多文档: