feat: Add multi java lts support. (#1054)

* feat: Add multi java lts support.

* Simplify the code

---------

Co-authored-by: JingZhang Chen <iRoiocam@gmail.com>
This commit is contained in:
He-Pin(kerr) 2024-01-28 17:46:03 +08:00 committed by GitHub
parent d55350e138
commit bcec7c0fa0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 93 additions and 50 deletions

View file

@ -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 static class Msg2 {}
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);
public class OptimizedActorWithJava21 extends UntypedAbstractActor {
public static class Msg1 {
}
}
private void receiveMsg1(Msg1 msg) {
// actual work
}
public static class Msg2 {
}
private void receiveMsg2(Msg2 msg) {
// actual work
}
public static class Msg3 {
}
private void receiveMsg3(Msg3 msg) {
// actual work
}
@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 receiveMsg2(Msg2 msg) {
// actual work
}
private void receiveMsg3(Msg3 msg) {
// actual work
}
}
// #pattern-matching

View file

@ -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)
}
}

View file

@ -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,

View file

@ -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 =

View file

@ -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(