From b50cc512cf6be930800a808e3b2a11aed6f0572f Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 2 Oct 2025 15:50:59 +0200 Subject: [PATCH 1/4] HV-2145 Remove a few now unnecessary forbidden api suppressions Signed-off-by: marko-bekhta --- .../engine/valueextraction/ListPropertyValueExtractor.java | 3 --- .../engine/valueextraction/MapPropertyKeyExtractor.java | 3 --- .../engine/valueextraction/MapPropertyValueExtractor.java | 3 --- .../engine/valueextraction/ObservableValueValueExtractor.java | 4 ---- .../valueextraction/ReadOnlyListPropertyValueExtractor.java | 3 --- .../valueextraction/ReadOnlyMapPropertyKeyExtractor.java | 3 --- .../valueextraction/ReadOnlyMapPropertyValueExtractor.java | 3 --- .../valueextraction/ReadOnlySetPropertyValueExtractor.java | 3 --- .../engine/valueextraction/SetPropertyValueExtractor.java | 3 --- .../internal/engine/ValidatorFactoryNoELBootstrapTest.java | 2 -- 10 files changed, 30 deletions(-) diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ListPropertyValueExtractor.java b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ListPropertyValueExtractor.java index c02d98f113..2a7c7c7987 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ListPropertyValueExtractor.java +++ b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ListPropertyValueExtractor.java @@ -10,7 +10,6 @@ import jakarta.validation.valueextraction.ExtractedValue; import jakarta.validation.valueextraction.ValueExtractor; -import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; import org.hibernate.validator.internal.engine.path.MutableNode; import javafx.beans.property.ListProperty; @@ -24,8 +23,6 @@ * * @author Guillaume Smet */ -@SuppressWarnings("restriction") -@IgnoreForbiddenApisErrors(reason = "Usage of JavaFX classes") class ListPropertyValueExtractor implements ValueExtractor> { static final ValueExtractorDescriptor DESCRIPTOR = new ValueExtractorDescriptor( new ListPropertyValueExtractor(), ListProperty.class, diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/MapPropertyKeyExtractor.java b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/MapPropertyKeyExtractor.java index 8b59c730c9..16d6b20ab9 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/MapPropertyKeyExtractor.java +++ b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/MapPropertyKeyExtractor.java @@ -10,7 +10,6 @@ import jakarta.validation.valueextraction.ExtractedValue; import jakarta.validation.valueextraction.ValueExtractor; -import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; import org.hibernate.validator.internal.engine.path.MutableNode; import javafx.beans.property.MapProperty; @@ -24,8 +23,6 @@ * * @author Guillaume Smet */ -@SuppressWarnings("restriction") -@IgnoreForbiddenApisErrors(reason = "Usage of JavaFX classes") class MapPropertyKeyExtractor implements ValueExtractor> { static final ValueExtractorDescriptor DESCRIPTOR = new ValueExtractorDescriptor( new MapPropertyKeyExtractor(), MapProperty.class, diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/MapPropertyValueExtractor.java b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/MapPropertyValueExtractor.java index fe1dacd7f9..83b77b0da7 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/MapPropertyValueExtractor.java +++ b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/MapPropertyValueExtractor.java @@ -10,7 +10,6 @@ import jakarta.validation.valueextraction.ExtractedValue; import jakarta.validation.valueextraction.ValueExtractor; -import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; import org.hibernate.validator.internal.engine.path.MutableNode; import javafx.beans.property.MapProperty; @@ -24,8 +23,6 @@ * * @author Guillaume Smet */ -@SuppressWarnings("restriction") -@IgnoreForbiddenApisErrors(reason = "Usage of JavaFX classes") class MapPropertyValueExtractor implements ValueExtractor> { static final ValueExtractorDescriptor DESCRIPTOR = new ValueExtractorDescriptor( new MapPropertyValueExtractor(), MapProperty.class, diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ObservableValueValueExtractor.java b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ObservableValueValueExtractor.java index 7dc2cd2660..53d94da56a 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ObservableValueValueExtractor.java +++ b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ObservableValueValueExtractor.java @@ -10,8 +10,6 @@ import jakarta.validation.valueextraction.UnwrapByDefault; import jakarta.validation.valueextraction.ValueExtractor; -import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; - import javafx.beans.value.ObservableValue; /** @@ -19,8 +17,6 @@ * * @author Gunnar Morling */ -@SuppressWarnings("restriction") -@IgnoreForbiddenApisErrors(reason = "Usage of JavaFX classes") @UnwrapByDefault class ObservableValueValueExtractor implements ValueExtractor> { diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyListPropertyValueExtractor.java b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyListPropertyValueExtractor.java index c2536a7dc9..9d17085153 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyListPropertyValueExtractor.java +++ b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyListPropertyValueExtractor.java @@ -10,7 +10,6 @@ import jakarta.validation.valueextraction.ExtractedValue; import jakarta.validation.valueextraction.ValueExtractor; -import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; import org.hibernate.validator.internal.engine.path.MutableNode; import javafx.beans.property.ReadOnlyListProperty; @@ -24,8 +23,6 @@ * * @author Guillaume Smet */ -@SuppressWarnings("restriction") -@IgnoreForbiddenApisErrors(reason = "Usage of JavaFX classes") class ReadOnlyListPropertyValueExtractor implements ValueExtractor> { static final ValueExtractorDescriptor DESCRIPTOR = new ValueExtractorDescriptor( new ReadOnlyListPropertyValueExtractor(), ReadOnlyListProperty.class, diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyMapPropertyKeyExtractor.java b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyMapPropertyKeyExtractor.java index 9d9d53dd2d..2dbaf2aec3 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyMapPropertyKeyExtractor.java +++ b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyMapPropertyKeyExtractor.java @@ -10,7 +10,6 @@ import jakarta.validation.valueextraction.ExtractedValue; import jakarta.validation.valueextraction.ValueExtractor; -import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; import org.hibernate.validator.internal.engine.path.MutableNode; import javafx.beans.property.ReadOnlyMapProperty; @@ -24,8 +23,6 @@ * * @author Guillaume Smet */ -@SuppressWarnings("restriction") -@IgnoreForbiddenApisErrors(reason = "Usage of JavaFX classes") class ReadOnlyMapPropertyKeyExtractor implements ValueExtractor> { static final ValueExtractorDescriptor DESCRIPTOR = new ValueExtractorDescriptor( new ReadOnlyMapPropertyKeyExtractor(), ReadOnlyMapProperty.class, diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyMapPropertyValueExtractor.java b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyMapPropertyValueExtractor.java index 07c55f2db6..07735f298f 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyMapPropertyValueExtractor.java +++ b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlyMapPropertyValueExtractor.java @@ -10,7 +10,6 @@ import jakarta.validation.valueextraction.ExtractedValue; import jakarta.validation.valueextraction.ValueExtractor; -import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; import org.hibernate.validator.internal.engine.path.MutableNode; import javafx.beans.property.ReadOnlyMapProperty; @@ -24,8 +23,6 @@ * * @author Guillaume Smet */ -@SuppressWarnings("restriction") -@IgnoreForbiddenApisErrors(reason = "Usage of JavaFX classes") class ReadOnlyMapPropertyValueExtractor implements ValueExtractor> { static final ValueExtractorDescriptor DESCRIPTOR = new ValueExtractorDescriptor( new ReadOnlyMapPropertyValueExtractor(), ReadOnlyMapProperty.class, diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlySetPropertyValueExtractor.java b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlySetPropertyValueExtractor.java index 41db79882d..bde49fadc5 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlySetPropertyValueExtractor.java +++ b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/ReadOnlySetPropertyValueExtractor.java @@ -10,7 +10,6 @@ import jakarta.validation.valueextraction.ExtractedValue; import jakarta.validation.valueextraction.ValueExtractor; -import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; import org.hibernate.validator.internal.engine.path.MutableNode; import javafx.beans.property.ReadOnlySetProperty; @@ -24,8 +23,6 @@ * * @author Guillaume Smet */ -@SuppressWarnings("restriction") -@IgnoreForbiddenApisErrors(reason = "Usage of JavaFX classes") class ReadOnlySetPropertyValueExtractor implements ValueExtractor> { static final ValueExtractorDescriptor DESCRIPTOR = new ValueExtractorDescriptor( new ReadOnlySetPropertyValueExtractor(), ReadOnlySetProperty.class, diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/SetPropertyValueExtractor.java b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/SetPropertyValueExtractor.java index f48bd6fdea..63c6b6a0ae 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/SetPropertyValueExtractor.java +++ b/engine/src/main/java/org/hibernate/validator/internal/engine/valueextraction/SetPropertyValueExtractor.java @@ -10,7 +10,6 @@ import jakarta.validation.valueextraction.ExtractedValue; import jakarta.validation.valueextraction.ValueExtractor; -import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; import org.hibernate.validator.internal.engine.path.MutableNode; import javafx.beans.property.SetProperty; @@ -24,8 +23,6 @@ * * @author Guillaume Smet */ -@SuppressWarnings("restriction") -@IgnoreForbiddenApisErrors(reason = "Usage of JavaFX classes") class SetPropertyValueExtractor implements ValueExtractor> { static final ValueExtractorDescriptor DESCRIPTOR = new ValueExtractorDescriptor( new SetPropertyValueExtractor(), SetProperty.class, diff --git a/engine/src/test/java/org/hibernate/validator/test/internal/engine/ValidatorFactoryNoELBootstrapTest.java b/engine/src/test/java/org/hibernate/validator/test/internal/engine/ValidatorFactoryNoELBootstrapTest.java index 4396e7279c..95dd113b65 100644 --- a/engine/src/test/java/org/hibernate/validator/test/internal/engine/ValidatorFactoryNoELBootstrapTest.java +++ b/engine/src/test/java/org/hibernate/validator/test/internal/engine/ValidatorFactoryNoELBootstrapTest.java @@ -23,7 +23,6 @@ import jakarta.validation.Validator; import jakarta.validation.constraints.Min; -import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; import org.hibernate.validator.internal.util.actions.GetClassLoader; import org.hibernate.validator.internal.util.actions.SetContextClassLoader; import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; @@ -141,7 +140,6 @@ public ELIgnoringClassLoader(String packageMissing) { } @Override - @IgnoreForbiddenApisErrors(reason = "getPackage() is deprecated but getDefinedPackage() is only available from JDK 9.") public Class loadClass(String className) throws ClassNotFoundException { // This is what we in the end want to achieve. Throw ClassNotFoundException for jakarta.el classes if ( className.startsWith( packageMissing ) ) { From 5b626cea0e5bfd0d4afb68af9b5d5de8361f2272 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 2 Oct 2025 19:07:20 +0200 Subject: [PATCH 2/4] HV-2145 Update forbidden api configuration Signed-off-by: marko-bekhta --- pom.xml | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 775d951381..ad0940a3d5 100644 --- a/pom.xml +++ b/pom.xml @@ -348,9 +348,9 @@ ${java-version.main.release} ${java-version.main.release} + ${java-version.main.release} ${java-version.test.release} ${java-version.test.release} - ${java-version.main.release} ${java-version.test.release} + false + false true **.IgnoreForbiddenApisErrors @@ -926,25 +927,32 @@ jdk-system-out jdk-non-portable + + - - jdk-unsafe-17 - jdk-unsafe-18 - jdk-unsafe-19 - jdk-unsafe-21 - jdk-unsafe-22 + + jdk-unsafe + jdk-deprecated-17 jdk-deprecated-18 jdk-deprecated-19 + jdk-deprecated-20 jdk-deprecated-21 jdk-deprecated-22 + jdk-deprecated-23 + jdk-deprecated-24 jdk-internal-17 jdk-internal-18 jdk-internal-19 + jdk-internal-20 jdk-internal-21 jdk-internal-22 + jdk-internal-23 + jdk-internal-24 @@ -955,8 +963,12 @@ verify + + 24 jdk-deprecated + jdk-non-portable + jdk-internal @@ -1182,7 +1194,7 @@ -Xdoclint:all,-missing - ${project.build.directory}/hibernate-asciidoctor-theme/javadoc/jdk21/stylesheet.css + From e6f7a520ef35ce2b17d5c0ceb19ff5b217f8f768 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Thu, 2 Oct 2025 19:15:49 +0200 Subject: [PATCH 3/4] HV-2145 Require JDK 25 for the build Signed-off-by: marko-bekhta --- .github/workflows/ci.yml | 8 ++++---- CONTRIBUTING.md | 10 +++++----- Jenkinsfile | 18 ++++++------------ jenkins/nightly/Jenkinsfile | 2 +- jenkins/release/Jenkinsfile | 2 +- jenkins/snapshot-publish/Jenkinsfile | 2 +- pom.xml | 2 +- 7 files changed, 19 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d49e3935c5..566d2fac08 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,20 +63,20 @@ jobs: matrix: os: - { - name: "Linux JDK 21", + name: "Linux JDK 25", runs-on: 'ubuntu-latest', java: { - version: 21 + version: 25 }, maven: { args: '' } } - { - name: "Windows JDK 21", + name: "Windows JDK 25", runs-on: 'windows-latest', java: { - version: 21 + version: 25 }, maven: { args: '' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6e74650f11..a51b851463 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,7 +49,7 @@ Just fork this repository, build your test case and attach it as an archive to a ### Build tools -You will need JDK 21 or above for the build. +You will need JDK 25 or above for the build. A maven wrapper script is provided at the root of the repository (`./mvnw`), so you can use that and don't need to care about the required version of Maven @@ -97,7 +97,7 @@ If you already did that, close IntelliJ IDEA, run `./mvnw clean`, and open Intel You will need to change some settings: * `Build, Execution, Deployment > Build Tools > Maven`: set `Maven home path` to `Use Maven wrapper` -* In `Project structure`, make sure the project JDK is JDK 21. +* In `Project structure`, make sure the project JDK is JDK 25. * Set up [formatting rules and code style](#setup-ide-formatting). Then a few steps will initialize your workspace: @@ -349,19 +349,19 @@ than [the one required for the build](#setup-build-tools), you will need to have both JDKs installed, and then you will need to pass additional properties to Maven. -To test Hibernate Validator against the JDK 17: +To test Hibernate Validator against the JDK 25: ```bash ./mvnw clean install ``` -To test Hibernate Validator against JDKs other than 17: +To test Hibernate Validator against JDKs other than 25: ```bash ./mvnw clean install -Djava-version.test.release=21 -Djava-version.test.compiler.java_home=/path/to/jdk21 ``` -Or more simply, if the JDK you want to test against is newer than 21 and is your default JDK: +Or more simply, if the JDK you want to test against is newer than 25 and is your default JDK: ```bash ./mvnw clean install -Djava-version.test.release=18 diff --git a/Jenkinsfile b/Jenkinsfile index 1f262aafaa..748427523c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -75,7 +75,7 @@ import org.hibernate.jenkins.pipeline.helpers.alternative.AlternativeMultiMap * */ -@Field final String DEFAULT_JDK_TOOL = 'OpenJDK 21 Latest' +@Field final String DEFAULT_JDK_TOOL = 'OpenJDK 25 Latest' @Field final String MAVEN_TOOL = 'Apache Maven 3.9' // Default node pattern, to be used for resource-intensive stages. @@ -115,31 +115,25 @@ stage('Configure') { new JdkBuildEnvironment(testJavaVersion: '17', testCompilerTool: 'OpenJDK 17 Latest', condition: TestCondition.AFTER_MERGE), new JdkBuildEnvironment(testJavaVersion: '21', testCompilerTool: 'OpenJDK 21 Latest', - condition: TestCondition.BEFORE_MERGE, - isDefault: true), + condition: TestCondition.AFTER_MERGE), // We want to enable preview features when testing newer builds of OpenJDK: // even if we don't use these features, just enabling them can cause side effects // and it's useful to test that. - new JdkBuildEnvironment(testJavaVersion: '23', testCompilerTool: 'OpenJDK 23 Latest', - testLauncherArgs: '--enable-preview', - condition: TestCondition.AFTER_MERGE), - new JdkBuildEnvironment(testJavaVersion: '24', testCompilerTool: 'OpenJDK 24 Latest', - testLauncherArgs: '--enable-preview', - condition: TestCondition.AFTER_MERGE), new JdkBuildEnvironment(testJavaVersion: '25', testCompilerTool: 'OpenJDK 25 Latest', testLauncherArgs: '--enable-preview', - condition: TestCondition.AFTER_MERGE), + condition: TestCondition.BEFORE_MERGE, + isDefault: true), new JdkBuildEnvironment(testJavaVersion: '26', testCompilerTool: 'OpenJDK 26 Latest', testLauncherArgs: '--enable-preview', condition: TestCondition.AFTER_MERGE) ], wildflyTck: [ - new WildFlyTckBuildEnvironment(testJavaVersion: '21', testCompilerTool: 'OpenJDK 21 Latest', + new WildFlyTckBuildEnvironment(testJavaVersion: '25', testCompilerTool: 'OpenJDK 25 Latest', condition: TestCondition.ON_DEMAND) ], sigtest: [ - new SigTestBuildEnvironment(testJavaVersion: '21', jdkTool: 'OpenJDK 21 Latest', + new SigTestBuildEnvironment(testJavaVersion: '25', jdkTool: 'OpenJDK 25 Latest', condition: TestCondition.BEFORE_MERGE) ] ]) diff --git a/jenkins/nightly/Jenkinsfile b/jenkins/nightly/Jenkinsfile index ed43ac0979..da491f7c5e 100644 --- a/jenkins/nightly/Jenkinsfile +++ b/jenkins/nightly/Jenkinsfile @@ -6,7 +6,7 @@ @Library('hibernate-jenkins-pipeline-helpers') _ def withMavenWorkspace(Closure body) { - withMavenWorkspace('OpenJDK 21 Latest', body) + withMavenWorkspace('OpenJDK 25 Latest', body) } def withMavenWorkspace(jdk, Closure body) { diff --git a/jenkins/release/Jenkinsfile b/jenkins/release/Jenkinsfile index d2cd25713b..aaa4ac2e9f 100644 --- a/jenkins/release/Jenkinsfile +++ b/jenkins/release/Jenkinsfile @@ -13,7 +13,7 @@ pipeline { } tools { maven 'Apache Maven 3.9' - jdk 'OpenJDK 21 Latest' + jdk 'OpenJDK 25 Latest' } options { buildDiscarder logRotator(daysToKeepStr: '30', numToKeepStr: '10') diff --git a/jenkins/snapshot-publish/Jenkinsfile b/jenkins/snapshot-publish/Jenkinsfile index 6bf1890b65..fdb69394a7 100644 --- a/jenkins/snapshot-publish/Jenkinsfile +++ b/jenkins/snapshot-publish/Jenkinsfile @@ -18,7 +18,7 @@ pipeline { } tools { maven 'Apache Maven 3.9' - jdk 'OpenJDK 21 Latest' + jdk 'OpenJDK 25 Latest' } options { // Wait for 1h before publishing snapshots, in case there's more commits. diff --git a/pom.xml b/pom.xml index ad0940a3d5..b9f6e210a3 100644 --- a/pom.xml +++ b/pom.xml @@ -405,7 +405,7 @@ - 21 + 25 -Xdoclint:all,-missing - + ${project.build.directory}/hibernate-asciidoctor-theme/javadoc/jdk${jdk.min.version}/stylesheet.css