1010 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
1111 ******************************************************************************/
1212
13+ // Use central version from gradle/versions.gradle
14+
15+ // --- Enforce Java version for running Gradle itself ---
16+ def currentJava = JavaVersion . current()
17+ def minJava = JavaVersion . VERSION_17 // xtend requires Java >= 17
18+ def maxJava = JavaVersion . VERSION_21 // Gradle 9.x is required for Java 25
19+
20+ if (currentJava < minJava || currentJava > maxJava) {
21+ throw new GradleException ("""
22+ This build must be run with Java between ${ minJava} and ${ maxJava} .
23+
24+ Current Java:
25+ JavaVersion.current() = ${ currentJava}
26+ java.version = ${ System.getProperty('java.version')}
27+ java.home = ${ System.getProperty('java.home')}
28+
29+ Please switch your JAVA_HOME or use the Gradle wrapper with a compatible JDK.
30+
31+ In addition, to run testOlderJavas tasks Java 17 and Java 11 must be discovrable.
32+ See https://docs.gradle.org/8.6/userguide/toolchains.html#sec:auto_detection
33+ """ )
34+ }
35+
1336java {
14- sourceCompatibility = JavaVersion . VERSION_11
37+ sourceCompatibility = JavaVersion . toVersion(versions. java)
38+ targetCompatibility = JavaVersion . toVersion(versions. java)
1539}
1640
1741tasks. withType(Javadoc ) {
@@ -21,6 +45,8 @@ tasks.withType(Javadoc) {
2145
2246tasks. withType(JavaCompile ) {
2347 options. encoding = ' UTF-8'
48+ // Ensure cross-compilation targets specified Java version
49+ options. release = versions. java as Integer
2450}
2551
2652task sourcesJar (type : Jar , dependsOn : classes) {
@@ -87,3 +113,59 @@ if (findProperty('ignoreTestFailures') == 'true') {
87113 ignoreFailures = true
88114 }
89115}
116+
117+ def testDir = file(' src/test/java' )
118+ def xtendTestClassPatterns = []
119+
120+ if (testDir. exists()) {
121+ testDir. eachFileRecurse { File f ->
122+ if (f. name. endsWith(' .xtend' )) {
123+ // Path relative to src/test/java, with Unix-ish separators
124+ def rel = testDir. toPath(). relativize(f. toPath()). toString()
125+ rel = rel. replace(File . separatorChar, ' /' as char )
126+
127+ // Replace .xtend with .class, wildcard anything before it
128+ // e.g. com/foo/BarTest.xtend -> **/com/foo/BarTest.class
129+ def classPattern = " **/${ rel[0..-6]} class"
130+ xtendTestClassPatterns << classPattern
131+ }
132+ }
133+ }
134+
135+ tasks. register(' testJava11' , Test ) {
136+ description = ' Runs non-xtend tests on Java 11 JVM'
137+ group = ' verification'
138+
139+ testClassesDirs = sourceSets. test. output. classesDirs
140+ classpath = sourceSets. test. runtimeClasspath
141+
142+ // Current version of xtend require JVM >= 17 to run,
143+ // so exclude xtend based tests
144+ if (! xtendTestClassPatterns. isEmpty()) {
145+ exclude xtendTestClassPatterns
146+ }
147+
148+ javaLauncher. set(
149+ javaToolchains. launcherFor {
150+ languageVersion = JavaLanguageVersion . of(11 )
151+ }
152+ )
153+ }
154+
155+ tasks. register(' testJava17' , Test ) {
156+ description = ' Runs tests on Java 17 JVM'
157+ group = ' verification'
158+
159+ testClassesDirs = sourceSets. test. output. classesDirs
160+ classpath = sourceSets. test. runtimeClasspath
161+
162+ javaLauncher. set(
163+ javaToolchains. launcherFor {
164+ languageVersion = JavaLanguageVersion . of(17 )
165+ }
166+ )
167+ }
168+
169+ tasks. register(' testOlderJavas' ) {
170+ dependsOn tasks. named(' testJava17' ), tasks. named(' testJava11' )
171+ }
0 commit comments