Skip to content

Commit 26f0f5a

Browse files
committed
feat: Add multi java lts support.
1 parent a2b5b5d commit 26f0f5a

File tree

6 files changed

+125
-59
lines changed

6 files changed

+125
-59
lines changed

docs/src/main/java-jdk-21/docs/actors/classical/OptimizedActorWithJava21.java

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package docs.actors.classical;
2+
// #pattern-matching
3+
4+
import org.apache.pekko.actor.UntypedAbstractActor;
5+
6+
public class OptimizedActorWithJava21 extends UntypedAbstractActor {
7+
public static class Msg1 {
8+
}
9+
10+
public static class Msg2 {
11+
}
12+
13+
public static class Msg3 {
14+
}
15+
16+
@Override
17+
public void onReceive(Object msg) throws Exception {
18+
switch (msg) {
19+
case Msg1 msg1 -> receiveMsg1(msg1);
20+
case Msg2 msg2 -> receiveMsg2(msg2);
21+
case Msg3 msg3 -> receiveMsg3(msg3);
22+
default -> unhandled(msg);
23+
}
24+
}
25+
26+
private void receiveMsg1(Msg1 msg) {
27+
// actual work
28+
}
29+
30+
private void receiveMsg2(Msg2 msg) {
31+
// actual work
32+
}
33+
34+
private void receiveMsg3(Msg3 msg) {
35+
// actual work
36+
}
37+
}
38+
// #pattern-matching

project/CopyrightHeaderForJdk9.scala

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,25 @@
1212
*/
1313

1414
import de.heikoseeberger.sbtheader.HeaderPlugin.autoImport.headerSources
15-
import sbt.Keys.sourceDirectory
1615
import sbt.{ Compile, Def, Test, _ }
1716

1817
object CopyrightHeaderForJdk9 extends AutoPlugin {
1918

2019
override lazy val requires = CopyrightHeader && Jdk9
2120
override lazy val trigger = allRequirements
2221

23-
override lazy val projectSettings: Seq[Def.Setting[_]] = {
22+
private lazy val additionalFiles = Def.setting {
2423
import Jdk9._
25-
Seq(
26-
Compile / headerSources ++=
27-
(((Compile / sourceDirectory).value / SCALA_SOURCE_DIRECTORY) ** "*.scala").get,
28-
Test / headerSources ++=
29-
(((Test / sourceDirectory).value / SCALA_TEST_SOURCE_DIRECTORY) ** "*.scala").get,
30-
Compile / headerSources ++=
31-
(((Compile / sourceDirectory).value / JAVA_SOURCE_DIRECTORY) ** "*.java").get,
32-
Test / headerSources ++=
33-
(((Test / sourceDirectory).value / JAVA_TEST_SOURCE_DIRECTORY) ** "*.java").get)
24+
for {
25+
dir <- additionalSourceDirectories.value ++ additionalTestSourceDirectories.value
26+
language <- List("java", "scala")
27+
file <- (dir ** s"*.$language").get
28+
} yield file
29+
}
30+
31+
override lazy val projectSettings: Seq[Def.Setting[_]] = {
32+
33+
Seq(Compile / headerSources ++= additionalFiles.value,
34+
Test / headerSources ++= additionalFiles.value)
3435
}
3536
}

project/Jdk9.scala

Lines changed: 60 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,36 +11,83 @@
1111
* Copyright (C) 2017-2022 Lightbend Inc. <https://www.lightbend.com>
1212
*/
1313

14-
import sbt._
1514
import sbt.Keys._
15+
import sbt._
1616

1717
object Jdk9 extends AutoPlugin {
1818
import JdkOptions.notOnJdk8
1919

20+
// The version 9 is special for any Java versions >= 9
21+
// and the version 11 is special for any Java versions >= 11
22+
// and the version 17 is special for any Java versions >= 17
23+
// and the version 21 is special for any Java versions >= 21
24+
private val supportedJavaLTSVersions = List("9", "11", "17", "21")
25+
2026
lazy val CompileJdk9 = config("CompileJdk9").extend(Compile)
2127

2228
lazy val TestJdk9 = config("TestJdk9").extend(Test).extend(CompileJdk9)
2329

24-
val SCALA_SOURCE_DIRECTORY = "scala-jdk-9"
25-
val SCALA_TEST_SOURCE_DIRECTORY = "scala-jdk9-only"
26-
val JAVA_SOURCE_DIRECTORY = "java-jdk-9"
27-
val JAVA_TEST_SOURCE_DIRECTORY = "java-jdk9-only"
30+
lazy val SCALA_SOURCE_DIRECTORY = getAdditionalSourceDirectoryNames("scala", isTest = false)
31+
lazy val SCALA_TEST_SOURCE_DIRECTORY = getAdditionalSourceDirectoryNames("scala", isTest = true)
32+
33+
lazy val JAVA_SOURCE_DIRECTORY = getAdditionalSourceDirectoryNames("java", isTest = false)
34+
lazy val JAVA_TEST_SOURCE_DIRECTORY = getAdditionalSourceDirectoryNames("java", isTest = true)
35+
36+
private lazy val additionalScalaSourceDirectories = Def.setting {
37+
getAdditionalSourceDirectories(
38+
(Compile / sourceDirectory).value,
39+
SCALA_SOURCE_DIRECTORY)
40+
}
41+
42+
private lazy val additionalJavaSourceDirectories = Def.setting {
43+
getAdditionalSourceDirectories(
44+
(Compile / sourceDirectory).value,
45+
JAVA_SOURCE_DIRECTORY)
46+
}
47+
48+
lazy val additionalSourceDirectories = Def.setting {
49+
additionalScalaSourceDirectories.value ++ additionalJavaSourceDirectories.value
50+
}
51+
52+
private lazy val additionalScalaTestSourceDirectories = Def.setting {
53+
getAdditionalSourceDirectories(
54+
(Test / sourceDirectory).value,
55+
SCALA_TEST_SOURCE_DIRECTORY)
56+
}
57+
58+
private lazy val additionalJavaTestSourceDirectories = Def.setting {
59+
getAdditionalSourceDirectories(
60+
(Test / sourceDirectory).value,
61+
JAVA_TEST_SOURCE_DIRECTORY)
62+
}
63+
64+
lazy val additionalTestSourceDirectories = Def.setting {
65+
additionalScalaTestSourceDirectories.value ++ additionalJavaTestSourceDirectories.value
66+
}
67+
68+
private def getAdditionalSourceDirectoryNames(language: String, isTest: Boolean): Seq[String] = {
69+
for {
70+
version <- supportedJavaLTSVersions if version.toInt <= JdkOptions.JavaVersion.majorVersion
71+
} yield {
72+
s"$language-jdk$version${if (isTest) "-only" else ""}"
73+
}
74+
}
75+
76+
private def getAdditionalSourceDirectories(baseDirectory: File,
77+
sourceDirectoryNames: Seq[String]): Seq[File] = {
78+
for (sourceDirectoryName <- sourceDirectoryNames)
79+
yield baseDirectory / sourceDirectoryName
80+
}
2881

2982
lazy val compileJdk9Settings = Seq(
3083
// following the scala-2.12, scala-sbt-1.0, ... convention
31-
unmanagedSourceDirectories := notOnJdk8(
32-
Seq(
33-
(Compile / sourceDirectory).value / SCALA_SOURCE_DIRECTORY,
34-
(Compile / sourceDirectory).value / JAVA_SOURCE_DIRECTORY)),
84+
unmanagedSourceDirectories := notOnJdk8(additionalSourceDirectories.value),
3585
scalacOptions := PekkoBuild.DefaultScalacOptions.value ++ notOnJdk8(Seq("-release", "11")),
3686
javacOptions := PekkoBuild.DefaultJavacOptions ++ notOnJdk8(Seq("--release", "11")))
3787

3888
lazy val testJdk9Settings = Seq(
3989
// following the scala-2.12, scala-sbt-1.0, ... convention
40-
unmanagedSourceDirectories := notOnJdk8(
41-
Seq(
42-
(Test / sourceDirectory).value / SCALA_TEST_SOURCE_DIRECTORY,
43-
(Test / sourceDirectory).value / JAVA_TEST_SOURCE_DIRECTORY)),
90+
unmanagedSourceDirectories := notOnJdk8(additionalTestSourceDirectories.value),
4491
scalacOptions := PekkoBuild.DefaultScalacOptions.value ++ notOnJdk8(Seq("-release", "11")),
4592
javacOptions := PekkoBuild.DefaultJavacOptions ++ notOnJdk8(Seq("--release", "11")),
4693
compile := compile.dependsOn(CompileJdk9 / compile).value,

project/JdkOptions.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@ object JdkOptions extends AutoPlugin {
2727

2828
lazy val specificationVersion: String = sys.props("java.specification.version")
2929

30+
object JavaVersion {
31+
val majorVersion: Int = {
32+
// FIXME replace with Runtime.version() when we no longer support Java 8
33+
// See Oracle section 1.5.3 at:
34+
// https://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html
35+
val version = specificationVersion.split('.')
36+
val majorString =
37+
if (version(0) == "1") version(1) // Java 8 will be 1.8
38+
else version(0) // later will be 9, 10, 11 etc
39+
majorString.toInt
40+
}
41+
}
42+
3043
lazy val isJdk8: Boolean =
3144
VersionNumber(specificationVersion).matchesSemVer(SemanticSelector(s"=1.8"))
3245
lazy val isJdk11orHigher: Boolean =

project/ProjectFileIgnoreSupport.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ import sbt.ConsoleLogger
1919
class ProjectFileIgnoreSupport(ignoreConfigFile: File, descriptor: String) {
2020
private lazy val stdoutLogger = ConsoleLogger(System.out)
2121

22-
private val javaSourceDirectories = Set("java", Jdk9.JAVA_SOURCE_DIRECTORY, Jdk9.JAVA_TEST_SOURCE_DIRECTORY)
22+
private val javaSourceDirectories = Set("java") ++ Jdk9.JAVA_SOURCE_DIRECTORY ++ Jdk9.JAVA_TEST_SOURCE_DIRECTORY
2323

24-
private val scalaSourceDirectories = Set("scala", Jdk9.SCALA_SOURCE_DIRECTORY, Jdk9.SCALA_TEST_SOURCE_DIRECTORY)
24+
private val scalaSourceDirectories = Set("scala") ++ Jdk9.SCALA_SOURCE_DIRECTORY ++ Jdk9.SCALA_TEST_SOURCE_DIRECTORY
2525

2626
private lazy val ignoreConfig = {
2727
require(

0 commit comments

Comments
 (0)