如何为每个Scala版本制作不同的子类?

zjf*_*fdu 6 scala maven

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

root
   -- scala-parent (ParentClass)
   -- scala-2.10 (SubClassScala210)
   -- scala-2.11 (SubClassScala211)
   -- scala-2.12 (SubClassScala212)
Run Code Online (Sandbox Code Playgroud)

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

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

请提供针对Maven而不是sbt的解决方案。

Mar*_*lic 6

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

鉴于scala-parent项目,scala-2.11scala-2.12子项目的是,接盘上,同时设置对子项目像现在这样dependsOn scala-parentcrossScalaVersionsscala-parentscalaVersion

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")
Run Code Online (Sandbox Code Playgroud)

同时设定crossScalaVersions := Seq()root该项目汇总其他项目:

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
  )
Run Code Online (Sandbox Code Playgroud)

现在执行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 ...
Run Code Online (Sandbox Code Playgroud)

注意如何scala-parent针对2.11和2.12进行交叉编译

> tree -d -L 1 scala-parent/target/
scala-parent/target/
??? scala-2.11
??? scala-2.12
Run Code Online (Sandbox Code Playgroud)

而子项目仅针对各自的版本而构建

> 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
Run Code Online (Sandbox Code Playgroud)