From 0a1e6abb4528d4353d4d649c507a37b3cdc4d1d2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 25 Oct 2025 07:34:27 +0000 Subject: [PATCH 1/6] Make jdk.jfr import optional in OSGi manifest Co-authored-by: laeubi <1331477+laeubi@users.noreply.github.com> --- .../src/main/kotlin/junitbuild.osgi-conventions.gradle.kts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts b/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts index 3dd9a2b7ee15..1eedde1d84a7 100644 --- a/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts +++ b/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts @@ -16,6 +16,7 @@ tasks.withType().named { val importAPIGuardian by extra { "org.apiguardian.*;resolution:=\"optional\"" } val importJSpecify by extra { "org.jspecify.*;resolution:=\"optional\"" } + val importJdkJfr by extra { "jdk.jfr;resolution:=\"optional\"" } extensions.create(BundleTaskExtension.NAME, this).apply { properties.set(projectDescription.map { @@ -38,6 +39,7 @@ tasks.withType().named { Import-Package: \ ${importAPIGuardian},\ ${importJSpecify},\ + ${importJdkJfr},\ org.junit.platform.commons.logging;status=INTERNAL,\ kotlin.*;resolution:="optional",\ * @@ -47,6 +49,7 @@ tasks.withType().named { -fixupmessages.kotlin.import: "Unused Import-Package instructions: \\[kotlin.*\\]";is:=ignore -fixupmessages.apiguardian.import: "Unused Import-Package instructions: \\[org.apiguardian.*\\]";is:=ignore -fixupmessages.jspecify.import: "Unused Import-Package instructions: \\[org.jspecify.*\\]";is:=ignore + -fixupmessages.jdkjfr.import: "Unused Import-Package instructions: \\[jdk.jfr\\]";is:=ignore # Don't scan for Class.forName package imports. # See https://bnd.bndtools.org/instructions/noclassforname.html @@ -86,8 +89,8 @@ val osgiProperties by tasks.registering(WriteProperties::class) { property("-runee", Callable { "JavaSE-${javaLibrary.mainJavaVersion.get()}" }) } property("-runrequires", "osgi.identity;filter:='(osgi.identity=${project.name})'") - property("-runsystempackages", "jdk.internal.misc,jdk.jfr,sun.misc") - // API Guardian should be optional -> instruct resolver to ignore it + property("-runsystempackages", "jdk.internal.misc,sun.misc") + // API Guardian and JDK JFR should be optional -> instruct resolver to ignore them // during resolution. Resolve should still pass. property("-runblacklist", "org.apiguardian.api") } From 27e4eae1a6236b290c1f3f9780cb06c21e8f1196 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Sun, 26 Oct 2025 11:31:34 +0100 Subject: [PATCH 2/6] Push down `jdk.jfr` import override to subproject --- .../main/kotlin/junitbuild.osgi-conventions.gradle.kts | 8 +++----- .../junit-platform-launcher.gradle.kts | 9 +++++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts b/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts index 1eedde1d84a7..9319e95415f3 100644 --- a/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts +++ b/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts @@ -16,7 +16,7 @@ tasks.withType().named { val importAPIGuardian by extra { "org.apiguardian.*;resolution:=\"optional\"" } val importJSpecify by extra { "org.jspecify.*;resolution:=\"optional\"" } - val importJdkJfr by extra { "jdk.jfr;resolution:=\"optional\"" } + val importCommonsLogging by extra { "org.junit.platform.commons.logging;status=INTERNAL" } extensions.create(BundleTaskExtension.NAME, this).apply { properties.set(projectDescription.map { @@ -39,8 +39,7 @@ tasks.withType().named { Import-Package: \ ${importAPIGuardian},\ ${importJSpecify},\ - ${importJdkJfr},\ - org.junit.platform.commons.logging;status=INTERNAL,\ + ${importCommonsLogging},\ kotlin.*;resolution:="optional",\ * @@ -49,7 +48,6 @@ tasks.withType().named { -fixupmessages.kotlin.import: "Unused Import-Package instructions: \\[kotlin.*\\]";is:=ignore -fixupmessages.apiguardian.import: "Unused Import-Package instructions: \\[org.apiguardian.*\\]";is:=ignore -fixupmessages.jspecify.import: "Unused Import-Package instructions: \\[org.jspecify.*\\]";is:=ignore - -fixupmessages.jdkjfr.import: "Unused Import-Package instructions: \\[jdk.jfr\\]";is:=ignore # Don't scan for Class.forName package imports. # See https://bnd.bndtools.org/instructions/noclassforname.html @@ -92,7 +90,7 @@ val osgiProperties by tasks.registering(WriteProperties::class) { property("-runsystempackages", "jdk.internal.misc,sun.misc") // API Guardian and JDK JFR should be optional -> instruct resolver to ignore them // during resolution. Resolve should still pass. - property("-runblacklist", "org.apiguardian.api") + property("-runblacklist", "org.apiguardian.api,jdk.jfr") } val osgiVerification = configurations.dependencyScope("osgiVerification") diff --git a/junit-platform-launcher/junit-platform-launcher.gradle.kts b/junit-platform-launcher/junit-platform-launcher.gradle.kts index 87f74cca330d..f20a4b784050 100644 --- a/junit-platform-launcher/junit-platform-launcher.gradle.kts +++ b/junit-platform-launcher/junit-platform-launcher.gradle.kts @@ -22,8 +22,17 @@ javadocConventions { tasks { jar { bundle { + val importAPIGuardian: String by extra + val importJSpecify: String by extra + val importCommonsLogging: String by extra val version = project.version bnd(""" + Import-Package: \ + ${importAPIGuardian},\ + ${importJSpecify},\ + ${importCommonsLogging},\ + jdk.jfr;resolution:="optional",\ + * Provide-Capability:\ org.junit.platform.launcher;\ org.junit.platform.launcher='junit-platform-launcher';\ From 8d2754f132e3efb2f494eb6695c9eaac7db39fca Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Sun, 26 Oct 2025 11:37:49 +0100 Subject: [PATCH 3/6] Reuse `importCommonsLogging` --- .../junit-jupiter-migrationsupport.gradle.kts | 3 ++- junit-vintage-engine/junit-vintage-engine.gradle.kts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/junit-jupiter-migrationsupport/junit-jupiter-migrationsupport.gradle.kts b/junit-jupiter-migrationsupport/junit-jupiter-migrationsupport.gradle.kts index a6fcef2c2756..bb8073b415fd 100644 --- a/junit-jupiter-migrationsupport/junit-jupiter-migrationsupport.gradle.kts +++ b/junit-jupiter-migrationsupport/junit-jupiter-migrationsupport.gradle.kts @@ -25,13 +25,14 @@ tasks { bundle { val importAPIGuardian: String by extra val importJSpecify: String by extra + val importCommonsLogging: String by extra bnd(""" # Import JUnit4 packages with a version Import-Package: \ $importAPIGuardian,\ $importJSpecify,\ + $importCommonsLogging,\ org.junit;version="[${libs.versions.junit4Min.get()},5)",\ - org.junit.platform.commons.logging;status=INTERNAL,\ org.junit.rules;version="[${libs.versions.junit4Min.get()},5)",\ * """) diff --git a/junit-vintage-engine/junit-vintage-engine.gradle.kts b/junit-vintage-engine/junit-vintage-engine.gradle.kts index a994acfc935a..b314f7823478 100644 --- a/junit-vintage-engine/junit-vintage-engine.gradle.kts +++ b/junit-vintage-engine/junit-vintage-engine.gradle.kts @@ -47,16 +47,17 @@ tasks { val version = project.version val importAPIGuardian: String by extra val importJSpecify: String by extra + val importCommonsLogging: String by extra bnd(""" # Import JUnit4 packages with a version Import-Package: \ ${importAPIGuardian},\ ${importJSpecify},\ + ${importCommonsLogging},\ junit.runner;version="[${junit4Min},5)",\ org.junit;version="[${junit4Min},5)",\ org.junit.experimental.categories;version="[${junit4Min},5)",\ org.junit.internal.builders;version="[${junit4Min},5)",\ - org.junit.platform.commons.logging;status=INTERNAL,\ org.junit.runner.*;version="[${junit4Min},5)",\ org.junit.runners.model;version="[${junit4Min},5)",\ * From 5a4bd56054e025aec2cd2430ffd570d2d20e8a47 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Sun, 26 Oct 2025 11:38:43 +0100 Subject: [PATCH 4/6] Treat bnd warnings as errors --- .../src/main/kotlin/junitbuild.osgi-conventions.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts b/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts index 9319e95415f3..5f93946a9ab2 100644 --- a/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts +++ b/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts @@ -48,6 +48,7 @@ tasks.withType().named { -fixupmessages.kotlin.import: "Unused Import-Package instructions: \\[kotlin.*\\]";is:=ignore -fixupmessages.apiguardian.import: "Unused Import-Package instructions: \\[org.apiguardian.*\\]";is:=ignore -fixupmessages.jspecify.import: "Unused Import-Package instructions: \\[org.jspecify.*\\]";is:=ignore + -fixupmessages.warningsAsErrors: ".*";restrict:=warning;is:=error # Don't scan for Class.forName package imports. # See https://bnd.bndtools.org/instructions/noclassforname.html From e9db5f053988118f768e12ae8494ed68873d34a8 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Sun, 26 Oct 2025 11:39:28 +0100 Subject: [PATCH 5/6] Remove obsolete suppression --- .../src/main/kotlin/junitbuild.osgi-conventions.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts b/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts index 5f93946a9ab2..6040ad6663af 100644 --- a/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts +++ b/gradle/plugins/common/src/main/kotlin/junitbuild.osgi-conventions.gradle.kts @@ -47,7 +47,6 @@ tasks.withType().named { # the kotlin and apiguardian packages, but enough modules do to make it a default. -fixupmessages.kotlin.import: "Unused Import-Package instructions: \\[kotlin.*\\]";is:=ignore -fixupmessages.apiguardian.import: "Unused Import-Package instructions: \\[org.apiguardian.*\\]";is:=ignore - -fixupmessages.jspecify.import: "Unused Import-Package instructions: \\[org.jspecify.*\\]";is:=ignore -fixupmessages.warningsAsErrors: ".*";restrict:=warning;is:=error # Don't scan for Class.forName package imports. From 8008c169f390fcf6e891f53c24819aec2db5af2b Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Sun, 26 Oct 2025 11:50:49 +0100 Subject: [PATCH 6/6] Add entry to release notes --- .../src/docs/asciidoc/release-notes/release-notes-6.0.1.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentation/src/docs/asciidoc/release-notes/release-notes-6.0.1.adoc b/documentation/src/docs/asciidoc/release-notes/release-notes-6.0.1.adoc index 6e7ced558c02..03dc184bc04b 100644 --- a/documentation/src/docs/asciidoc/release-notes/release-notes-6.0.1.adoc +++ b/documentation/src/docs/asciidoc/release-notes/release-notes-6.0.1.adoc @@ -16,6 +16,8 @@ repository on GitHub. [[release-notes-6.0.1-junit-platform-bug-fixes]] ==== Bug Fixes +* The `jdk.jfr` package is now an optional import when using the `junit-platform-launcher` + as an OSGi bundle. * Remove remnants of Java 8 compatibility from User Guide. [[release-notes-6.0.1-junit-platform-deprecations-and-breaking-changes]]