如何为每个 scala 版本创建不同的子类



这是我的项目结构。我想在运行时加载基于 scala 版本的不同子类。

root
   -- scala-parent (ParentClass)
   -- scala-2.10 (SubClassScala210)
   -- scala-2.11 (SubClassScala211)
   -- scala-2.12 (SubClassScala212)

基类位于 scala-parent 中,而其他模块具有不同的子类。我可以针对不同版本的 scala 库构建子类模块(scala-2.10/scala-2.11/scala-2.12(。 问题是我只能再次构建一个特定版本的scala父级。

我想知道此类问题的最佳实践是什么,如何为每个 scala 版本构建子类?

请为 maven 提供解决方案,而不是为 sbt 提供解决方案。

sbt-cross-build-dependson-example展示了如何交叉构建由多个子项目组成的项目,其中子项目不同的 Scala 版本取决于父项目。

给定scala-parent项目,以及scala-2.11scala-2.12 dependsOn scala-parent子项目,则在scala-parent上设置crossScalaVersions,同时在这样的子项目上设置scalaVersion

lazy val scalaParent = (project in file("scala-parent")).settings(crossScalaVersions := Seq("2.11.0", "2.12.0"))
lazy val scala211  = (project in file("scala-2.11")).dependsOn(scalaParent).settings(scalaVersion := "2.11.0")
lazy val scala212  = (project in file("scala-2.12")).dependsOn(scalaParent).settings(scalaVersion := "2.12.0")

还要对聚合其他项目的root项目设置crossScalaVersions := Seq()

lazy val root = (project in file("."))
  .aggregate(scalaParent, scala211, scala212)
  .settings(
    name := "sbt-cross-build-dependson-example",
    libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.5" % Test,
    crossScalaVersions := Seq() // https://github.com/sbt/sbt/issues/4262#issuecomment-405607763
  )

现在执行sbt +compile(注意+(应该交叉构建项目:

sbt:sbt-cross-build-dependson-example> +compile
[info] Setting Scala version to 2.12.0 on 2 projects.
...
[info] Updating scala212...
[info] Compiling 1 Scala source to /Users/mario/IdeaProjects/sbt-cross-build-dependson-example/scala-parent/target/scala-2.12/classes ...
[info] Compiling 1 Scala source to /Users/mario/IdeaProjects/sbt-cross-build-dependson-example/scala-2.12/target/scala-2.12/classes ...
...
[info] Setting Scala version to 2.11.0 on 2 projects.
...
[info] Updating scala211...
[info] Compiling 1 Scala source to /Users/mario/IdeaProjects/sbt-cross-build-dependson-example/scala-parent/target/scala-2.11/classes ...
[info] Compiling 1 Scala source to /Users/mario/IdeaProjects/sbt-cross-build-dependson-example/scala-2.11/target/scala-2.11/classes ...

请注意 2.11 和 2.12 如何交叉编译scala-parent

> tree -d -L 1 scala-parent/target/
scala-parent/target/
├── scala-2.11
├── scala-2.12

而子项目只是为各自的版本构建的

> tree -d -L 1 scala-2.11/target/
scala-2.11/target/
├── scala-2.11
tree -d -L 1 scala-2.12/target/
scala-2.12/target/
├── scala-2.12

最新更新