应用程序可以使用已开发的较低 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 库,但还不能相反,尽管这正在逐步改变并且在未来)。
查看有关此的更多文档:
我正在将应用程序升级到 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 库,但还不能相反,尽管这正在逐步改变并且在未来)。
查看有关此的更多文档: