You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pekko.apache.org by he...@apache.org on 2024/01/28 09:46:08 UTC

(incubator-pekko) branch main updated: feat: Add multi java lts support. (#1054)

This is an automated email from the ASF dual-hosted git repository.

hepin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-pekko.git


The following commit(s) were added to refs/heads/main by this push:
     new bcec7c0fa0 feat: Add multi java lts support. (#1054)
bcec7c0fa0 is described below

commit bcec7c0fa0cd9f68c4858d168f0dfadcb3ba4602
Author: He-Pin(kerr) <he...@gmail.com>
AuthorDate: Sun Jan 28 17:46:03 2024 +0800

    feat: Add multi java lts support. (#1054)
    
    * feat: Add multi java lts support.
    
    * Simplify the code
    
    ---------
    
    Co-authored-by: JingZhang Chen <iR...@gmail.com>
---
 .../actors/classical/OptimizedActorWithJava21.java | 49 +++++++++++----------
 project/CopyrightHeaderForJdk9.scala               | 23 +++++-----
 project/Jdk9.scala                                 | 50 ++++++++++++++++------
 project/JdkOptions.scala                           | 13 ++++++
 project/ProjectFileIgnoreSupport.scala             |  4 +-
 5 files changed, 91 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 ab43f2f35c..7223b99ce4 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 aa1b6ccdc4..1707bbbc38 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 7c3bfb33f6..e368aeddb2 100644
--- a/project/Jdk9.scala
+++ b/project/Jdk9.scala
@@ -11,36 +11,60 @@
  * Copyright (C) 2017-2022 Lightbend Inc. <https://www.lightbend.com>
  */
 
-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")
+  lazy val ScalaTestSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("scala", isTest = true)
+
+  lazy val JavaSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("java")
+  lazy val JavaTestSourceDirectories: Seq[String] = getAdditionalSourceDirectoryNames("java", isTest = true)
+
+  lazy val additionalSourceDirectories =
+    getAdditionalSourceDirectories(Compile, ScalaSourceDirectories ++ JavaSourceDirectories)
+
+  lazy val additionalTestSourceDirectories =
+    getAdditionalSourceDirectories(Test, ScalaTestSourceDirectories ++ JavaTestSourceDirectories)
+
+  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"
+      } else {
+        s"$language-jdk-$version"
+      }
+    }
+  }
+
+  private def getAdditionalSourceDirectories(task: Configuration, sourceDirectoryNames: Seq[String]) = Def.setting {
+    for (sourceDirectoryName <- sourceDirectoryNames)
+      yield (task / sourceDirectory).value / 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 c89af7d652..852a2bb82d 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 d4a5414b64..fa055c94fb 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(


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pekko.apache.org
For additional commands, e-mail: commits-help@pekko.apache.org