From cf456674b9ce1254a3502a70a4a099d197527834 Mon Sep 17 00:00:00 2001 From: He-Pin Date: Sat, 27 Jan 2024 22:22:27 +0800 Subject: [PATCH 1/2] feat: Add multi java lts support. --- .../classical/OptimizedActorWithJava21.java | 49 ++++++------ project/CopyrightHeaderForJdk9.scala | 23 +++--- project/Jdk9.scala | 77 +++++++++++++++---- project/JdkOptions.scala | 13 ++++ project/ProjectFileIgnoreSupport.scala | 4 +- 5 files changed, 118 insertions(+), 48 deletions(-) diff --git a/docs/src/main/java-jdk-21/docs/actors/classical/OptimizedActorWithJava21.java b/docs/src/main/java-jdk-21/docs/actors/classical/OptimizedActorWithJava21.java index ab43f2f35c2..7223b99ce42 100644 --- a/docs/src/main/java-jdk-21/docs/actors/classical/OptimizedActorWithJava21.java +++ b/docs/src/main/java-jdk-21/docs/actors/classical/OptimizedActorWithJava21.java @@ -1,33 +1,38 @@ - +package docs.actors.classical; // #pattern-matching -static class OptimizedActorWithJava21 extends UntypedAbstractActor { - public static class Msg1 {} +import org.apache.pekko.actor.UntypedAbstractActor; + +public class OptimizedActorWithJava21 extends UntypedAbstractActor { + public static class Msg1 { + } - public static class Msg2 {} + public static class Msg2 { + } - public static class Msg3 {} + public static class Msg3 { + } - @Override - public void onReceive(Object msg) throws Exception { - switch(msg) { - case Msg1 msg -> receiveMsg1((Msg1) msg); - case Msg2 msg -> receiveMsg2((Msg2) msg); - case Msg3 msg -> receiveMsg3((Msg3) msg); - default _ -> unhandled(msg); + @Override + public void onReceive(Object msg) throws Exception { + switch (msg) { + case Msg1 msg1 -> receiveMsg1(msg1); + case Msg2 msg2 -> receiveMsg2(msg2); + case Msg3 msg3 -> receiveMsg3(msg3); + default -> unhandled(msg); + } } - } - private void receiveMsg1(Msg1 msg) { - // actual work - } + private void receiveMsg1(Msg1 msg) { + // actual work + } - private void receiveMsg2(Msg2 msg) { - // actual work - } + private void receiveMsg2(Msg2 msg) { + // actual work + } - private void receiveMsg3(Msg3 msg) { - // actual work - } + private void receiveMsg3(Msg3 msg) { + // actual work + } } // #pattern-matching diff --git a/project/CopyrightHeaderForJdk9.scala b/project/CopyrightHeaderForJdk9.scala index aa1b6ccdc49..1707bbbc385 100644 --- a/project/CopyrightHeaderForJdk9.scala +++ b/project/CopyrightHeaderForJdk9.scala @@ -12,7 +12,6 @@ */ import de.heikoseeberger.sbtheader.HeaderPlugin.autoImport.headerSources -import sbt.Keys.sourceDirectory import sbt.{ Compile, Def, Test, _ } object CopyrightHeaderForJdk9 extends AutoPlugin { @@ -20,16 +19,18 @@ object CopyrightHeaderForJdk9 extends AutoPlugin { override lazy val requires = CopyrightHeader && Jdk9 override lazy val trigger = allRequirements - override lazy val projectSettings: Seq[Def.Setting[_]] = { + private lazy val additionalFiles = Def.setting { import Jdk9._ - Seq( - Compile / headerSources ++= - (((Compile / sourceDirectory).value / SCALA_SOURCE_DIRECTORY) ** "*.scala").get, - Test / headerSources ++= - (((Test / sourceDirectory).value / SCALA_TEST_SOURCE_DIRECTORY) ** "*.scala").get, - Compile / headerSources ++= - (((Compile / sourceDirectory).value / JAVA_SOURCE_DIRECTORY) ** "*.java").get, - Test / headerSources ++= - (((Test / sourceDirectory).value / JAVA_TEST_SOURCE_DIRECTORY) ** "*.java").get) + for { + dir <- additionalSourceDirectories.value ++ additionalTestSourceDirectories.value + language <- List("java", "scala") + file <- (dir ** s"*.$language").get + } yield file + } + + override lazy val projectSettings: Seq[Def.Setting[_]] = { + + Seq(Compile / headerSources ++= additionalFiles.value, + Test / headerSources ++= additionalFiles.value) } } diff --git a/project/Jdk9.scala b/project/Jdk9.scala index 7c3bfb33f63..e145b436cff 100644 --- a/project/Jdk9.scala +++ b/project/Jdk9.scala @@ -11,36 +11,87 @@ * Copyright (C) 2017-2022 Lightbend Inc. */ -import sbt._ import sbt.Keys._ +import sbt._ object Jdk9 extends AutoPlugin { import JdkOptions.notOnJdk8 + // The version 9 is special for any Java versions >= 9 + // and the version 11 is special for any Java versions >= 11 + // and the version 17 is special for any Java versions >= 17 + // and the version 21 is special for any Java versions >= 21 + private val supportedJavaLTSVersions = List("9", "11", "17", "21") + lazy val CompileJdk9 = config("CompileJdk9").extend(Compile) lazy val TestJdk9 = config("TestJdk9").extend(Test).extend(CompileJdk9) - val SCALA_SOURCE_DIRECTORY = "scala-jdk-9" - val SCALA_TEST_SOURCE_DIRECTORY = "scala-jdk9-only" - val JAVA_SOURCE_DIRECTORY = "java-jdk-9" - val JAVA_TEST_SOURCE_DIRECTORY = "java-jdk9-only" + lazy val ScalaSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("scala", isTest = false) + lazy val ScalaTestSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("scala", isTest = true) + + lazy val JavaSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("java", isTest = false) + lazy val JavaTestSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("java", isTest = true) + + private lazy val additionalScalaSourceDirectories = Def.setting { + getAdditionalSourceDirectories( + (Compile / sourceDirectory).value, + ScalaSourceDirectories) + } + + private lazy val additionalJavaSourceDirectories = Def.setting { + getAdditionalSourceDirectories( + (Compile / sourceDirectory).value, + JavaSourceDirectories) + } + + lazy val additionalSourceDirectories = Def.setting { + additionalScalaSourceDirectories.value ++ additionalJavaSourceDirectories.value + } + + private lazy val additionalScalaTestSourceDirectories = Def.setting { + getAdditionalSourceDirectories( + (Test / sourceDirectory).value, + ScalaTestSourceDirectories) + } + + private lazy val additionalJavaTestSourceDirectories = Def.setting { + getAdditionalSourceDirectories( + (Test / sourceDirectory).value, + JavaTestSourceDirectories) + } + + lazy val additionalTestSourceDirectories = Def.setting { + additionalScalaTestSourceDirectories.value ++ additionalJavaTestSourceDirectories.value + } + + private def getAdditionalSourceDirectoryNames(language: String, isTest: Boolean): Seq[String] = { + for { + version <- supportedJavaLTSVersions if version.toInt <= JdkOptions.JavaVersion.majorVersion + } yield { + if (isTest) { + s"$language-jdk${version}-only" + } else { + s"$language-jdk-$version" + } + } + } + + private def getAdditionalSourceDirectories(baseDirectory: File, + sourceDirectoryNames: Seq[String]): Seq[File] = { + for (sourceDirectoryName <- sourceDirectoryNames) + yield baseDirectory / sourceDirectoryName + } lazy val compileJdk9Settings = Seq( // following the scala-2.12, scala-sbt-1.0, ... convention - unmanagedSourceDirectories := notOnJdk8( - Seq( - (Compile / sourceDirectory).value / SCALA_SOURCE_DIRECTORY, - (Compile / sourceDirectory).value / JAVA_SOURCE_DIRECTORY)), + unmanagedSourceDirectories := notOnJdk8(additionalSourceDirectories.value), scalacOptions := PekkoBuild.DefaultScalacOptions.value ++ notOnJdk8(Seq("-release", "11")), javacOptions := PekkoBuild.DefaultJavacOptions ++ notOnJdk8(Seq("--release", "11"))) lazy val testJdk9Settings = Seq( // following the scala-2.12, scala-sbt-1.0, ... convention - unmanagedSourceDirectories := notOnJdk8( - Seq( - (Test / sourceDirectory).value / SCALA_TEST_SOURCE_DIRECTORY, - (Test / sourceDirectory).value / JAVA_TEST_SOURCE_DIRECTORY)), + unmanagedSourceDirectories := notOnJdk8(additionalTestSourceDirectories.value), scalacOptions := PekkoBuild.DefaultScalacOptions.value ++ notOnJdk8(Seq("-release", "11")), javacOptions := PekkoBuild.DefaultJavacOptions ++ notOnJdk8(Seq("--release", "11")), compile := compile.dependsOn(CompileJdk9 / compile).value, diff --git a/project/JdkOptions.scala b/project/JdkOptions.scala index c89af7d652c..852a2bb82da 100644 --- a/project/JdkOptions.scala +++ b/project/JdkOptions.scala @@ -27,6 +27,19 @@ object JdkOptions extends AutoPlugin { lazy val specificationVersion: String = sys.props("java.specification.version") + object JavaVersion { + val majorVersion: Int = { + // FIXME replace with Runtime.version() when we no longer support Java 8 + // See Oracle section 1.5.3 at: + // https://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html + val version = specificationVersion.split('.') + val majorString = + if (version(0) == "1") version(1) // Java 8 will be 1.8 + else version(0) // later will be 9, 10, 11 etc + majorString.toInt + } + } + lazy val isJdk8: Boolean = VersionNumber(specificationVersion).matchesSemVer(SemanticSelector(s"=1.8")) lazy val isJdk11orHigher: Boolean = diff --git a/project/ProjectFileIgnoreSupport.scala b/project/ProjectFileIgnoreSupport.scala index d4a5414b645..fa055c94fb0 100644 --- a/project/ProjectFileIgnoreSupport.scala +++ b/project/ProjectFileIgnoreSupport.scala @@ -19,9 +19,9 @@ import sbt.ConsoleLogger class ProjectFileIgnoreSupport(ignoreConfigFile: File, descriptor: String) { private lazy val stdoutLogger = ConsoleLogger(System.out) - private val javaSourceDirectories = Set("java", Jdk9.JAVA_SOURCE_DIRECTORY, Jdk9.JAVA_TEST_SOURCE_DIRECTORY) + private val javaSourceDirectories = Set("java") ++ Jdk9.JavaSourceDirectories ++ Jdk9.JavaTestSourceDirectories - private val scalaSourceDirectories = Set("scala", Jdk9.SCALA_SOURCE_DIRECTORY, Jdk9.SCALA_TEST_SOURCE_DIRECTORY) + private val scalaSourceDirectories = Set("scala") ++ Jdk9.ScalaSourceDirectories ++ Jdk9.ScalaTestSourceDirectories private lazy val ignoreConfig = { require( From ab19f1e9e173adb0fdebac98d98deac58c929871 Mon Sep 17 00:00:00 2001 From: JingZhang Chen Date: Sun, 28 Jan 2024 00:28:50 +0800 Subject: [PATCH 2/2] Simplify the code --- project/Jdk9.scala | 47 ++++++++++------------------------------------ 1 file changed, 10 insertions(+), 37 deletions(-) diff --git a/project/Jdk9.scala b/project/Jdk9.scala index e145b436cff..e368aeddb28 100644 --- a/project/Jdk9.scala +++ b/project/Jdk9.scala @@ -27,60 +27,33 @@ object Jdk9 extends AutoPlugin { lazy val TestJdk9 = config("TestJdk9").extend(Test).extend(CompileJdk9) - lazy val ScalaSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("scala", isTest = false) + lazy val ScalaSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("scala") lazy val ScalaTestSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("scala", isTest = true) - lazy val JavaSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("java", isTest = false) + lazy val JavaSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("java") lazy val JavaTestSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("java", isTest = true) - private lazy val additionalScalaSourceDirectories = Def.setting { - getAdditionalSourceDirectories( - (Compile / sourceDirectory).value, - ScalaSourceDirectories) - } - - private lazy val additionalJavaSourceDirectories = Def.setting { - getAdditionalSourceDirectories( - (Compile / sourceDirectory).value, - JavaSourceDirectories) - } - - lazy val additionalSourceDirectories = Def.setting { - additionalScalaSourceDirectories.value ++ additionalJavaSourceDirectories.value - } + lazy val additionalSourceDirectories = + getAdditionalSourceDirectories(Compile, ScalaSourceDirectories ++ JavaSourceDirectories) - private lazy val additionalScalaTestSourceDirectories = Def.setting { - getAdditionalSourceDirectories( - (Test / sourceDirectory).value, - ScalaTestSourceDirectories) - } - - private lazy val additionalJavaTestSourceDirectories = Def.setting { - getAdditionalSourceDirectories( - (Test / sourceDirectory).value, - JavaTestSourceDirectories) - } - - lazy val additionalTestSourceDirectories = Def.setting { - additionalScalaTestSourceDirectories.value ++ additionalJavaTestSourceDirectories.value - } + lazy val additionalTestSourceDirectories = + getAdditionalSourceDirectories(Test, ScalaTestSourceDirectories ++ JavaTestSourceDirectories) - private def getAdditionalSourceDirectoryNames(language: String, isTest: Boolean): Seq[String] = { + private def getAdditionalSourceDirectoryNames(language: String, isTest: Boolean = false): Seq[String] = { for { version <- supportedJavaLTSVersions if version.toInt <= JdkOptions.JavaVersion.majorVersion } yield { if (isTest) { - s"$language-jdk${version}-only" + s"$language-jdk$version-only" } else { s"$language-jdk-$version" } } } - private def getAdditionalSourceDirectories(baseDirectory: File, - sourceDirectoryNames: Seq[String]): Seq[File] = { + private def getAdditionalSourceDirectories(task: Configuration, sourceDirectoryNames: Seq[String]) = Def.setting { for (sourceDirectoryName <- sourceDirectoryNames) - yield baseDirectory / sourceDirectoryName + yield (task / sourceDirectory).value / sourceDirectoryName } lazy val compileJdk9Settings = Seq(