Skip to content

Commit e7d14a1

Browse files
committed
Require JDK 21 for building (but keep the Java 17 baseline)
1 parent 0ad8f2c commit e7d14a1

File tree

14 files changed

+55
-24
lines changed

14 files changed

+55
-24
lines changed

.github/workflows/ci-report.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ jobs:
2121
with:
2222
persist-credentials: false
2323
ref: ${{ github.ref }}
24-
- name: Set up Java 17
24+
- name: Set up JDK
2525
uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0
2626
with:
2727
distribution: 'temurin'
28-
java-version: '17'
28+
java-version: '21'
2929

3030
- name: Generate cache key
3131
id: cache-key

.github/workflows/ci.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
build:
2626
permissions:
2727
contents: read
28-
name: OpenJDK 17 - ${{matrix.rdbms}}
28+
name: OpenJDK 21 - ${{matrix.rdbms}}
2929
runs-on: ubuntu-latest
3030
strategy:
3131
fail-fast: false
@@ -55,11 +55,11 @@ jobs:
5555
env:
5656
RDBMS: ${{ matrix.rdbms }}
5757
run: ci/database-start.sh
58-
- name: Set up Java 17
58+
- name: Set up Java 21
5959
uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0
6060
with:
6161
distribution: 'temurin'
62-
java-version: '17'
62+
java-version: '21'
6363

6464
- name: Generate cache key
6565
id: cache-key
@@ -253,11 +253,11 @@ jobs:
253253
persist-credentials: false
254254
- name: Reclaim disk space and sanitize user home
255255
run: .github/ci-prerequisites-atlas.sh
256-
- name: Set up Java 17
256+
- name: Set up Java 21
257257
uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0
258258
with:
259259
distribution: 'temurin'
260-
java-version: '17'
260+
java-version: '21'
261261

262262
- name: Generate cache key
263263
id: cache-key

.github/workflows/codeql.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ jobs:
4040
uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0
4141
with:
4242
distribution: 'temurin'
43-
java-version: '17'
43+
java-version: '21'
4444

4545
- name: Checkout repository
4646
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

Jenkinsfile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper
1414
@Library('hibernate-jenkins-pipeline-helpers') _
1515
import org.hibernate.jenkins.pipeline.helpers.job.JobHelper
1616

17-
@Field final String DEFAULT_JDK_VERSION = '17'
17+
@Field final String DEFAULT_JDK_VERSION = '21'
1818
@Field final String DEFAULT_JDK_TOOL = "OpenJDK ${DEFAULT_JDK_VERSION} Latest"
1919
@Field final String NODE_PATTERN_BASE = 'Worker&&Containers'
2020
@Field List<BuildEnvironment> environments
@@ -40,10 +40,11 @@ stage('Configure') {
4040
// Don't build with HANA by default, but only do it nightly until we receive a 3rd instance
4141
// new BuildEnvironment( dbName: 'hana_cloud', dbLockableResource: 'hana-cloud', dbLockResourceAsHost: true ),
4242
new BuildEnvironment( node: 's390x' ),
43+
// We build with JDK 21, but produce Java 17 bytecode, so we test with JDK 17, to be sure everything works.
44+
new BuildEnvironment( testJdkVersion: '17' ),
4345
// We want to enable preview features when testing newer builds of OpenJDK:
4446
// even if we don't use these features, just enabling them can cause side effects
4547
// and it's useful to test that.
46-
new BuildEnvironment( testJdkVersion: '21', testJdkLauncherArgs: '--enable-preview' ),
4748
new BuildEnvironment( testJdkVersion: '23', testJdkLauncherArgs: '--enable-preview' ),
4849
new BuildEnvironment( testJdkVersion: '24', testJdkLauncherArgs: '--enable-preview' ),
4950
// The following JDKs aren't supported by Hibernate ORM out-of-the box yet:

README.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ for its CI needs. See
2121

2222
== Building from sources
2323

24-
The build requires at least Java 11 and at most Java 17.
24+
The build requires at least JDK 21, and produces Java 17 bytecode.
2525

2626
Hibernate uses https://gradle.org[Gradle] as its build tool. See the _Gradle Primer_ section below if you are new to
2727
Gradle.

ci/jpa-3.2-tck.Jenkinsfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ else {
2222
pipeline {
2323
agent none
2424
tools {
25-
jdk 'OpenJDK 17 Latest'
25+
jdk 'OpenJDK 21 Latest'
2626
}
2727
options {
2828
rateLimitBuilds(throttle: [count: throttleCount, durationName: 'day', userBoost: true])

ci/release/Jenkinsfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ pipeline {
7070
cron('0 0 * * 0')
7171
}
7272
tools {
73-
jdk 'OpenJDK 17 Latest'
73+
jdk 'OpenJDK 21 Latest'
7474
}
7575
options {
7676
buildDiscarder logRotator(daysToKeepStr: '30', numToKeepStr: '10')

ci/snapshot-publish.Jenkinsfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pipeline {
2323
label 'Release'
2424
}
2525
tools {
26-
jdk 'OpenJDK 17 Latest'
26+
jdk 'OpenJDK 21 Latest'
2727
}
2828
options {
2929
rateLimitBuilds(throttle: [count: 1, durationName: 'hour', userBoost: true])

gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ org.gradle.java.installations.auto-download=false
2727

2828
# externalized definition of JDK versions so that they are available in both Project (build.gradle) and Settings (settings.gradle)
2929
orm.jdk.base=17
30+
orm.jdk.min=21
3031
orm.jdk.max=24

local-build-plugins/src/main/java/org/hibernate/orm/toolchains/JdkVersionConfig.java

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Set;
99

1010
import org.gradle.StartParameter;
11+
import org.gradle.api.GradleException;
1112
import org.gradle.api.Project;
1213
import org.gradle.api.initialization.Settings;
1314
import org.gradle.jvm.toolchain.JavaLanguageVersion;
@@ -32,13 +33,15 @@ public class JdkVersionConfig {
3233

3334
private final boolean explicit;
3435
private final JavaLanguageVersion baseline;
36+
private final JavaLanguageVersion min;
3537
private final JavaLanguageVersion max;
3638
private final MainJdks main;
3739
private final TestJdks test;
3840

3941
public JdkVersionConfig(
4042
boolean explicit,
4143
JavaLanguageVersion baseline,
44+
JavaLanguageVersion min,
4245
JavaLanguageVersion max,
4346
JavaLanguageVersion mainCompilerVersion,
4447
JavaLanguageVersion mainReleaseVersion,
@@ -47,6 +50,7 @@ public JdkVersionConfig(
4750
JavaLanguageVersion testLauncherVersion) {
4851
this.explicit = explicit;
4952
this.baseline = baseline;
53+
this.min = min;
5054
this.max = max;
5155
this.main = new MainJdks( mainCompilerVersion, mainReleaseVersion );
5256
this.test = new TestJdks( testCompileVersion, testReleaseVersion, testLauncherVersion );
@@ -72,6 +76,18 @@ public JavaLanguageVersion getBaselineVersion() {
7276
return getBaseline();
7377
}
7478

79+
public JavaLanguageVersion getMin() {
80+
return min;
81+
}
82+
83+
public String getMinStr() {
84+
return getMin().toString();
85+
}
86+
87+
public JavaLanguageVersion getMinVersion() {
88+
return getMin();
89+
}
90+
7591
public JavaLanguageVersion getMax() {
7692
return max;
7793
}
@@ -128,36 +144,36 @@ public static JdkVersionConfig createVersionConfig(
128144
JavaLanguageVersion explicitTestVersion,
129145
JavaLanguageVersion gradleJdkVersion,
130146
JavaLanguageVersion baselineJdkVersion,
147+
JavaLanguageVersion minSupportedJdkVersion,
131148
JavaLanguageVersion maxSupportedJdkVersion) {
132149
final boolean explicitlyConfigured = explicitMainVersion != null || explicitTestVersion != null;
133150

134151
final JavaLanguageVersion mainCompilerVersion;
135152
final JavaLanguageVersion mainReleaseVersion;
136153
final JavaLanguageVersion testCompilerVersion;
137-
final JavaLanguageVersion testReleaseVersion;
154+
JavaLanguageVersion testReleaseVersion;
138155
final JavaLanguageVersion testLauncherVersion;
139156

140157
if ( explicitlyConfigured ) {
141-
mainCompilerVersion = requireNonNullElse( explicitMainVersion, baselineJdkVersion );
142-
testCompilerVersion = requireNonNullElse( explicitTestVersion, baselineJdkVersion );
158+
mainCompilerVersion = requireNonNullElse( explicitMainVersion, minSupportedJdkVersion );
159+
testCompilerVersion = requireNonNullElse( explicitTestVersion, minSupportedJdkVersion );
143160
mainReleaseVersion = baselineJdkVersion;
144161

145-
if ( testCompilerVersion.asInt() > maxSupportedJdkVersion.asInt() ) {
162+
testReleaseVersion = requireNonNullElse( explicitTestVersion, mainReleaseVersion );
163+
if ( testReleaseVersion.asInt() > maxSupportedJdkVersion.asInt() ) {
146164
System.out.println(
147-
"[WARN] Gradle does not support bytecode version '" + testCompilerVersion + "'."
165+
"[WARN] Gradle does not support bytecode version '" + testReleaseVersion + "'."
148166
+ " Forcing test bytecode to version " + maxSupportedJdkVersion + "."
149167
);
150168
testReleaseVersion = maxSupportedJdkVersion;
151169
}
152-
else {
153-
testReleaseVersion = testCompilerVersion;
154-
}
155170

156-
testLauncherVersion = testCompilerVersion;
171+
testLauncherVersion = testReleaseVersion;
157172

158173
return new JdkVersionConfig(
159174
true,
160175
baselineJdkVersion,
176+
minSupportedJdkVersion,
161177
maxSupportedJdkVersion,
162178
mainCompilerVersion,
163179
mainReleaseVersion,
@@ -170,6 +186,11 @@ public static JdkVersionConfig createVersionConfig(
170186
// Not testing a particular JDK version: we will use the same JDK used to run Gradle.
171187
// We disable toolchains for convenience, so that anyone can just run the build with their own JDK
172188
// without any additional options and without downloading the whole JDK.
189+
190+
if ( gradleJdkVersion.asInt() > minSupportedJdkVersion.asInt() ) {
191+
throw new GradleException("This build requires at least JDK " + minSupportedJdkVersion + ", but you are using JDK " + gradleJdkVersion.asInt());
192+
}
193+
173194
if ( gradleJdkVersion.asInt() > maxSupportedJdkVersion.asInt() ) {
174195
System.out.println(
175196
"[WARN] Gradle does not support this JDK, because it is too recent; build is likely to fail."
@@ -184,6 +205,7 @@ public static JdkVersionConfig createVersionConfig(
184205
return new JdkVersionConfig(
185206
false,
186207
baselineJdkVersion,
208+
minSupportedJdkVersion,
187209
maxSupportedJdkVersion,
188210
gradleJdkVersion,
189211
baselineJdkVersion,

local-build-plugins/src/main/java/org/hibernate/orm/toolchains/JdkVersionPlugin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,15 @@ public void apply(Project project) {
4949
final VersionCatalogsExtension versionCatalogs = project.getExtensions().getByType( VersionCatalogsExtension.class );
5050
final VersionCatalog jdkVersions = versionCatalogs.named( "jdks" );
5151
final JavaLanguageVersion baselineJdkVersion = getJavaLanguageVersion( jdkVersions, "baseline" );
52+
final JavaLanguageVersion minSupportedJdkVersion = getJavaLanguageVersion( jdkVersions, "minSupportedJdk" );
5253
final JavaLanguageVersion maxSupportedJdkVersion = getJavaLanguageVersion( jdkVersions, "maxSupportedBytecode" );
5354

5455
final JdkVersionConfig jdkVersionConfig = createVersionConfig(
5556
explicitMainVersion,
5657
explicitTestVersion,
5758
gradleJdkVersion,
5859
baselineJdkVersion,
60+
minSupportedJdkVersion,
5961
maxSupportedJdkVersion
6062
);
6163

local-build-plugins/src/main/java/org/hibernate/orm/toolchains/JdkVersionSettingsPlugin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,15 @@ public void apply(Settings settings) {
3636

3737
final JavaLanguageVersion gradleJdkVersion = JavaLanguageVersion.of( JavaVersion.current().getMajorVersion() );
3838
final JavaLanguageVersion baselineJdkVersion = getJavaLanguageVersion( settings, "orm.jdk.base" );
39+
final JavaLanguageVersion minSupportedJdkVersion = getJavaLanguageVersion( settings, "orm.jdk.min" );
3940
final JavaLanguageVersion maxSupportedJdkVersion = getJavaLanguageVersion( settings, "orm.jdk.max" );
4041

4142
final JdkVersionConfig jdkVersionConfig = createVersionConfig(
4243
explicitMainVersion,
4344
explicitTestVersion,
4445
gradleJdkVersion,
4546
baselineJdkVersion,
47+
minSupportedJdkVersion,
4648
maxSupportedJdkVersion
4749
);
4850

nightly.Jenkinsfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper
1414
@Library('hibernate-jenkins-pipeline-helpers') _
1515
import org.hibernate.jenkins.pipeline.helpers.job.JobHelper
1616

17-
@Field final String DEFAULT_JDK_VERSION = '17'
17+
@Field final String DEFAULT_JDK_VERSION = '21'
1818
@Field final String DEFAULT_JDK_TOOL = "OpenJDK ${DEFAULT_JDK_VERSION} Latest"
1919
@Field final String NODE_PATTERN_BASE = 'Worker&&Containers'
2020
@Field List<BuildEnvironment> environments

settings.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,15 @@ dependencyResolutionManagement {
5959
jdks {
6060
// see gradle.properties (or set with -D/-P)
6161
var String baseJdk = jdkVersions.baseline
62+
var String minJdk = jdkVersions.min
6263
var String maxJdk = jdkVersions.max
6364

6465
version "baseline", baseJdk
6566
version "compatible", "17 or 21"
6667
version "jdbc", "4.2" // Bundled with JDK 11
6768

69+
// We may require a minimum JDK version, for consistency across builds
70+
version "minSupportedJdk", minJdk
6871
// Gradle does bytecode transformation on tests.
6972
// You can't use bytecode higher than what Gradle supports, even with toolchains.
7073
version "maxSupportedBytecode", maxJdk

0 commit comments

Comments
 (0)