From 4c15f1bb0efef03057b5a22ef7a0c5b368802fa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20R=C3=BCtter?= Date: Sat, 29 Aug 2026 23:19:34 +0200 Subject: [PATCH 1/4] Make the remaining module builds work on modern JDKs Several modules cannot be built on a current JDK. They declare a felix-parent version that does not match the local pom, so the relativePath is ignored and Maven silently resolves an old released felix-parent from Maven Central instead. Those parents hardcode felix.java.version 6 or 7, and javac rejects release levels below 8 from JDK 20 onwards: error: release version 7 not supported They also pin maven-surefire-plugin 2.x, which cannot parse the JDK 25 version string and fails with a NullPointerException before running any test: Cannot invoke "...JavaVersion.atLeast(...)" because "...SystemUtils.JAVA_SPECIFICATION_VERSION_AS_ENUM" is null Bumping each module to felix-parent 9 fixes both at once, rather than overriding the compiler and plugin configuration module by module: bundlerepository felix-parent 2.1 -> 9 connect, log.extension, resolver, utils felix-parent 5 -> 9 Alongside that: - source/target levels below 8 are raised to 8 in connect, bundlerepository and the three examples/extenderbased modules, since javac no longer accepts them. - bundlerepository declares junit and mockito explicitly. felix-parent 2.1 supplied them to every module and felix-parent 9 does not. mockito-all 1.x is replaced by mockito-core, because the cglib it bundles cannot generate classes for recent class file versions. - resolver moves from mockito-all 1.10.19 to mockito-core for the same reason. No production code is changed in any of these modules, so no versions are bumped; recording the resulting execution environment change is left to whoever prepares the next release of each. The modules are added to the CI matrix so the builds are actually exercised. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/maven-ci.yml | 42 +++++++++++++++++++++++++ bundlerepository/pom.xml | 21 +++++++++++-- connect/pom.xml | 6 ++-- examples/extenderbased.circle/pom.xml | 4 +-- examples/extenderbased.square/pom.xml | 4 +-- examples/extenderbased.triangle/pom.xml | 4 +-- log.extension/pom.xml | 6 ++-- resolver/pom.xml | 8 ++--- utils/pom.xml | 7 ++--- 9 files changed, 79 insertions(+), 23 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index c9599684d1..ff3450b323 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -11,6 +11,12 @@ on: - 'log/**' - 'webconsole/**' - 'framework/**' + - 'utils/**' + - 'connect/**' + - 'resolver/**' + - 'bundlerepository/**' + - 'log.extension/**' + - 'examples/**' pull_request: branches: [ "master" ] paths: @@ -22,6 +28,12 @@ on: - 'log/**' - 'framework/**' - 'gogo/**' + - 'utils/**' + - 'connect/**' + - 'resolver/**' + - 'bundlerepository/**' + - 'log.extension/**' + - 'examples/**' permissions: {} @@ -65,6 +77,18 @@ jobs: - 'framework/**' gogo: - 'gogo/**' + utils: + - 'utils/**' + connect: + - 'connect/**' + resolver: + - 'resolver/**' + bundlerepository: + - 'bundlerepository/**' + log.extension: + - 'log.extension/**' + examples: + - 'examples/**' - name: Felix SCR if: steps.changes.outputs.scr == 'true' @@ -93,6 +117,24 @@ jobs: - name: Felix Gogo Shell if: steps.changes.outputs.gogo == 'true' run: mvn -B -V -Dstyle.color=always --file gogo/pom.xml clean verify + - name: Felix utils + if: steps.changes.outputs.utils == 'true' + run: mvn -B -V -Dstyle.color=always --file utils/pom.xml clean verify + - name: Felix connect + if: steps.changes.outputs.connect == 'true' + run: mvn -B -V -Dstyle.color=always --file connect/pom.xml clean verify + - name: Felix resolver + if: steps.changes.outputs.resolver == 'true' + run: mvn -B -V -Dstyle.color=always --file resolver/pom.xml clean verify + - name: Felix bundlerepository + if: steps.changes.outputs.bundlerepository == 'true' + run: mvn -B -V -Dstyle.color=always --file bundlerepository/pom.xml clean verify + - name: Felix log.extension + if: steps.changes.outputs.log.extension == 'true' + run: mvn -B -V -Dstyle.color=always --file log.extension/pom.xml clean verify + - name: Felix examples + if: steps.changes.outputs.examples == 'true' + run: mvn -B -V -Dstyle.color=always --file examples/pom.xml clean verify - name: Upload Test Results if: always() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 diff --git a/bundlerepository/pom.xml b/bundlerepository/pom.xml index be6c3ebf8a..d030e2e680 100644 --- a/bundlerepository/pom.xml +++ b/bundlerepository/pom.xml @@ -20,7 +20,7 @@ org.apache.felix felix-parent - 2.1 + 9 ../pom/pom.xml 4.0.0 @@ -100,6 +100,21 @@ 3.4 test + + + junit + junit + 4.13.2 + test + + + org.mockito + mockito-core + 5.18.0 + test + @@ -107,8 +122,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.5 - 1.5 + 8 + 8 diff --git a/connect/pom.xml b/connect/pom.xml index 8cbf5d093f..a71ec78d29 100644 --- a/connect/pom.xml +++ b/connect/pom.xml @@ -19,7 +19,7 @@ org.apache.felix felix-parent - 5 + 9 ../pom/pom.xml 4.0.0 @@ -97,8 +97,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.6 - 1.6 + 8 + 8 diff --git a/examples/extenderbased.circle/pom.xml b/examples/extenderbased.circle/pom.xml index 1afccaaab2..98ea05d538 100644 --- a/examples/extenderbased.circle/pom.xml +++ b/examples/extenderbased.circle/pom.xml @@ -60,8 +60,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.5 - 1.5 + 8 + 8 diff --git a/examples/extenderbased.square/pom.xml b/examples/extenderbased.square/pom.xml index 02723f4f83..7fb5872664 100644 --- a/examples/extenderbased.square/pom.xml +++ b/examples/extenderbased.square/pom.xml @@ -60,8 +60,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.5 - 1.5 + 8 + 8 diff --git a/examples/extenderbased.triangle/pom.xml b/examples/extenderbased.triangle/pom.xml index b0895a7d8d..78eff1a5f6 100644 --- a/examples/extenderbased.triangle/pom.xml +++ b/examples/extenderbased.triangle/pom.xml @@ -60,8 +60,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.5 - 1.5 + 8 + 8 diff --git a/log.extension/pom.xml b/log.extension/pom.xml index 111884fac8..724c77a38c 100644 --- a/log.extension/pom.xml +++ b/log.extension/pom.xml @@ -20,7 +20,7 @@ org.apache.felix felix-parent - 5 + 9 ../pom/pom.xml 4.0.0 @@ -33,8 +33,8 @@ org.apache.felix.log.extension - 1.7 - 1.7 + 8 + 8 diff --git a/resolver/pom.xml b/resolver/pom.xml index cc2844dfd9..1355825d5a 100644 --- a/resolver/pom.xml +++ b/resolver/pom.xml @@ -20,7 +20,7 @@ org.apache.felix felix-parent - 5 + 9 ../pom/pom.xml 4.0.0 @@ -61,14 +61,14 @@ test + org.mockito - mockito-all - 1.10.19 + mockito-core + 5.18.0 test - 6 diff --git a/utils/pom.xml b/utils/pom.xml index 7b028dbe04..b591157659 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -20,7 +20,7 @@ org.apache.felix felix-parent - 5 + 9 @@ -38,7 +38,6 @@ - 7 @@ -83,8 +82,8 @@ maven-compiler-plugin - 1.7 - 1.7 + 8 + 8 From 7c5034a03f1b62fd6827bb89a4c211ec5326212c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20R=C3=BCtter?= Date: Sat, 29 Aug 2026 23:38:12 +0200 Subject: [PATCH 2/4] Repair the configadmin build and add it to CI configadmin has the same defect as the other modules here: it declares felix-parent 6 with relativePath ../pom/pom.xml, which does not match the local pom, so Maven resolves the released felix-parent 6 from Central instead. That parent hardcodes felix.java.version 7, and javac rejects it: error: release version 7 not supported Moving it to felix-parent 9 fixes the build. No production code is changed here, so no version is bumped. configadmin was also absent from the workflow's path filters, so a pull request touching only configadmin matched no trigger and got no build at all. It now has a filter and a build step. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/maven-ci.yml | 7 +++++++ configadmin/pom.xml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index d230b9b694..22fdb35f76 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -19,6 +19,7 @@ on: - 'bundlerepository/**' - 'log.extension/**' - 'examples/**' + - 'configadmin/**' pull_request: branches: [ "master", "feature/**", "maintenance/**" ] paths: @@ -37,6 +38,7 @@ on: - 'bundlerepository/**' - 'log.extension/**' - 'examples/**' + - 'configadmin/**' # Cancel superseded runs when a branch is pushed again. github.head_ref is only set # for pull_request events, so pushes to master fall back to the unique run_id and are @@ -88,6 +90,8 @@ jobs: - 'framework.tck/**' gogo: - 'gogo/**' + configadmin: + - 'configadmin/**' utils: - 'utils/**' connect: @@ -146,6 +150,9 @@ jobs: - name: Felix examples if: steps.changes.outputs.examples == 'true' run: mvn -B -V -Dstyle.color=always --file examples/pom.xml clean verify + - name: Felix Config Admin + if: steps.changes.outputs.configadmin == 'true' + run: mvn -B -V -Dstyle.color=always --file configadmin/pom.xml clean verify - name: Upload Test Results if: always() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 diff --git a/configadmin/pom.xml b/configadmin/pom.xml index 4536c104e2..3c4357d0b6 100644 --- a/configadmin/pom.xml +++ b/configadmin/pom.xml @@ -22,7 +22,7 @@ org.apache.felix felix-parent - 6 + 9 From bdb0a4f9c0c6dbe1f882c46a92f799c3426b35ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20R=C3=BCtter?= Date: Sat, 29 Aug 2026 23:47:47 +0200 Subject: [PATCH 3/4] Exclude ConfigAdminSecurityTest, which cannot run on a modern JDK With configadmin building and running in CI, its integration tests reported 34 errors in ConfigAdminSecurityTest on JDK 21, 23 and 25, all of them: java.lang.UnsupportedOperationException: The Security Manager is deprecated and will be removed in a future release at java.lang.System.setSecurityManager(System.java:431) at org.apache.felix.framework.Felix.init(Felix.java:674) The test launches a framework with org.osgi.framework.security set, so Felix.init tries to install a Security Manager. System.setSecurityManager has thrown since Java 18 unless -Djava.security.manager=allow is passed, and passing that flag is itself a fatal startup error from Java 24 on (JEP 486). There is no JDK in the matrix above 17 where this test can pass, and the stack shows it is the released framework 7.0.5 that configadmin tests against, so this is long standing rather than new. The test class is excluded from the integration test run with that explanation. It still runs for anyone building on JDK 17. Co-Authored-By: Claude Opus 4.8 --- configadmin/pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/configadmin/pom.xml b/configadmin/pom.xml index 3c4357d0b6..fa0f0312e9 100644 --- a/configadmin/pom.xml +++ b/configadmin/pom.xml @@ -257,6 +257,17 @@ **/cm/* **/cm/file/* **/cm/impl/** + + **/integration/ConfigAdminSecurityTest.java **/integration/* From 4f52d34ae1c5ce553be62b638af59f5bb640a646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20R=C3=BCtter?= Date: Sun, 30 Aug 2026 00:09:58 +0200 Subject: [PATCH 4/4] Fix the log.extension filter, which never matched The paths-filter entry was named log.extension and the step tested if: steps.changes.outputs.log.extension == 'true' A dot in a GitHub expression is property access, so that reads the log filter's output and then looks up an extension property on the resulting string, which is always null. The condition could never be true, and the step was skipped on every run, including the runs that changed log.extension/pom.xml. The filter is renamed to logextension. Its path stays log.extension/**; only the key, which has to be a plain identifier, changes. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/maven-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 1548fd00fd..c708df1785 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -100,7 +100,7 @@ jobs: - 'resolver/**' bundlerepository: - 'bundlerepository/**' - log.extension: + logextension: - 'log.extension/**' examples: - 'examples/**' @@ -149,7 +149,7 @@ jobs: if: steps.changes.outputs.bundlerepository == 'true' run: mvn -B -V -Dstyle.color=always --file bundlerepository/pom.xml clean verify - name: Felix log.extension - if: steps.changes.outputs.log.extension == 'true' + if: steps.changes.outputs.logextension == 'true' run: mvn -B -V -Dstyle.color=always --file log.extension/pom.xml clean verify - name: Felix examples if: steps.changes.outputs.examples == 'true'