Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
f819bc2
FELIX-6759-Java-25-LTS
paulrutter Jul 14, 2025
b40faf7
FELIX-6759-Java-25-LTS
paulrutter Jul 14, 2025
43302ea
FELIX-6759-Java-25-LTS
paulrutter Jul 14, 2025
71cf356
FELIX-6759-Java-25-LTS
paulrutter Jul 14, 2025
4dfa162
FELIX-6759-Java-25-LTS
paulrutter Jul 14, 2025
d88a64c
FELIX-6759-Java-25-LTS
paulrutter Jul 14, 2025
a15676b
FELIX-6759-Java-25-LTS
paulrutter Jul 15, 2025
eafd8fb
Merge remote-tracking branch 'origin/master' into feature/FELIX-6759-…
paulrutter Aug 29, 2026
a801def
FELIX-6759-Java-25-LTS - Remove SecurityManager usage for JDK 25
paulrutter Aug 29, 2026
c748879
FELIX-6759-Java-25-LTS - Fix remaining JDK 25 build blockers
paulrutter Aug 29, 2026
3900808
FELIX-6759-Java-25-LTS - Close CI coverage gaps for changed modules
paulrutter Aug 29, 2026
662d0ee
FELIX-6759-Java-25-LTS - Unmask CI failures and fix what they exposed
paulrutter Aug 29, 2026
e2a1fe7
FELIX-6759-Java-25-LTS - Remove CI trigger markers and dead fields
paulrutter Aug 29, 2026
f8cd4ef
FELIX-6759-Java-25-LTS - Align byte-buddy with assertj-core 3.27.7 in…
paulrutter Aug 29, 2026
2d79ad7
FELIX-6759-Java-25-LTS - Cancel superseded CI runs
paulrutter Aug 29, 2026
3779881
FELIX-6759-Java-25-LTS - Repair FilterImpl.WrapperCapability, fixing …
paulrutter Aug 29, 2026
25984be
FELIX-6759-Java-25-LTS - Run CI for pull requests onto feature branches
paulrutter Aug 29, 2026
630fa4a
FELIX-6759-Java-25-LTS - Bump versions for the raised execution envir…
paulrutter Aug 29, 2026
40c4c0a
FELIX-6759-Java-25-LTS - Only bump the framework version
paulrutter Aug 29, 2026
4c15f1b
Make the remaining module builds work on modern JDKs
paulrutter Aug 29, 2026
fd2b935
Replace Thread.stop() with interrupt() in UpdateThread
paulrutter Aug 29, 2026
7c9c987
FELIX-6759-Java-25-LTS - Narrow the PR to modules it actually changes
paulrutter Aug 29, 2026
92ebd78
FELIX-6759-Java-25-LTS - Repair the paths-filter block
paulrutter Aug 29, 2026
0d38666
Merge branch 'feature/FELIX-6759-Java-25-LTS' into fix-module-builds-…
paulrutter Aug 29, 2026
035ab35
Merge branch 'feature/FELIX-6759-Java-25-LTS' into fix-configadmin-th…
paulrutter Aug 29, 2026
8a7dba6
FELIX-6759-Java-25-LTS - Record the changes in each module's changelog
paulrutter Aug 29, 2026
45f6d17
Build configadmin in CI
paulrutter Aug 29, 2026
7c5034a
Repair the configadmin build and add it to CI
paulrutter Aug 29, 2026
3e9c967
Revert "Build configadmin in CI"
paulrutter Aug 29, 2026
135b580
Merge branch 'fix-module-builds-modern-jdk' into fix-configadmin-thre…
paulrutter Aug 29, 2026
bdb0a4f
Exclude ConfigAdminSecurityTest, which cannot run on a modern JDK
paulrutter Aug 29, 2026
3d8a217
Merge branch 'fix-module-builds-modern-jdk' into fix-configadmin-thre…
paulrutter Aug 29, 2026
8d767f7
FELIX-6759-Java-25-LTS - Install the framework so the TCK tests the l…
paulrutter Aug 29, 2026
1a57450
Merge branch 'feature/FELIX-6759-Java-25-LTS' into fix-module-builds-…
paulrutter Aug 29, 2026
c66d2ee
Merge branch 'fix-module-builds-modern-jdk' into fix-configadmin-thre…
paulrutter Aug 29, 2026
4f52d34
Fix the log.extension filter, which never matched
paulrutter Aug 29, 2026
a39072f
Merge branch 'fix-module-builds-modern-jdk' into fix-configadmin-thre…
paulrutter Aug 29, 2026
97898b3
FELIX-6759-Java-25-LTS - Point gogo.jline at the new gogo.runtime ver…
paulrutter Aug 29, 2026
820b7e6
Merge branch 'feature/FELIX-6759-Java-25-LTS' into fix-module-builds-…
paulrutter Aug 29, 2026
e8f5e4d
Merge branch 'fix-module-builds-modern-jdk' into fix-configadmin-thre…
paulrutter Aug 29, 2026
466bd67
FELIX-6759-Java-25-LTS - Build main in CI, and repair its build
paulrutter Aug 29, 2026
1ee939c
FELIX-6759-Java-25-LTS - Move main to 8.0.0 and stop committing its b…
paulrutter Aug 29, 2026
74b27fa
FELIX-6759-Java-25-LTS - Also ignore main.distribution build output
paulrutter Aug 29, 2026
c527f99
Merge branch 'feature/FELIX-6759-Java-25-LTS' into fix-module-builds-…
paulrutter Aug 29, 2026
706d4fe
Merge branch 'fix-module-builds-modern-jdk' into fix-configadmin-thre…
paulrutter Aug 29, 2026
99a7cff
FELIX-6759 - Do not share the default properties between framework in…
paulrutter Sep 3, 2026
8a94e2d
Merge pull request #555 from apache/fix-module-builds-modern-jdk
paulrutter Sep 4, 2026
dacfc68
Merge pull request #556 from apache/fix-configadmin-thread-stop
paulrutter Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 74 additions & 4 deletions .github/workflows/maven-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,18 @@ on:
- 'log/**'
- 'webconsole/**'
- 'framework/**'
- 'gogo/**'
- 'framework.tck/**'
- 'main/**'
- 'utils/**'
- 'connect/**'
- 'resolver/**'
- 'bundlerepository/**'
- 'log.extension/**'
- 'examples/**'
- 'configadmin/**'
pull_request:
branches: [ "master" ]
branches: [ "master", "feature/**", "maintenance/**" ]
paths:
- 'scr/**'
- 'http/**'
Expand All @@ -22,6 +32,22 @@ on:
- 'log/**'
- 'framework/**'
- 'gogo/**'
- 'framework.tck/**'
- 'main/**'
- 'utils/**'
- 'connect/**'
- 'resolver/**'
- '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
# never cancelled.
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

permissions: {}

Expand All @@ -31,7 +57,7 @@ jobs:
strategy:
fail-fast: false
matrix:
java: [17,21,23]
java: [17,21,23,25]
steps:
- uses: actions/checkout@v6
- name: Set up JDK ${{ matrix.java }}
Expand Down Expand Up @@ -63,9 +89,25 @@ jobs:
- 'log/**'
framework:
- 'framework/**'
- 'framework.tck/**'
gogo:
- 'gogo/**'

main:
- 'main/**'
configadmin:
- 'configadmin/**'
utils:
- 'utils/**'
connect:
- 'connect/**'
resolver:
- 'resolver/**'
bundlerepository:
- 'bundlerepository/**'
logextension:
- 'log.extension/**'
examples:
- 'examples/**'
- name: Felix SCR
if: steps.changes.outputs.scr == 'true'
run: mvn -B -V -Dstyle.color=always --file scr/pom.xml clean verify
Expand All @@ -86,13 +128,41 @@ jobs:
run: mvn -B -V -Dstyle.color=always --file webconsole/pom.xml clean install verify
- name: Felix Framework
if: steps.changes.outputs.framework == 'true'
run: mvn -B -V -Dstyle.color=always --file framework/pom.xml clean verify
# install, not verify: the TCK below is a separate Maven invocation and resolves
# the framework from the repository, so without installing it would silently test
# whatever org.apache.felix.framework happens to be published rather than the
# build under test.
run: mvn -B -V -Dstyle.color=always --file framework/pom.xml clean install
- name: OSGi-TCK Framework
if: steps.changes.outputs.framework == 'true'
run: mvn -B -V -Dstyle.color=always --file framework.tck/pom.xml clean verify
- name: Felix Main
if: steps.changes.outputs.main == 'true'
run: mvn -B -V -Dstyle.color=always --file main/pom.xml clean verify
- 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.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'
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
Expand Down
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,11 @@ dependency-reduced-pom.xml
/.metadata/
/workspace/
.vscode

# Generated by the main and main.distribution builds. Note that
# main.distribution/conf is tracked and must not be ignored.
main/bundle/
main/bin/
main/conf/
main.distribution/bundle/
main.distribution/bin/
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,32 @@

The **Apache Felix** project is a collection of semi-related **OSGi** sub-projects that build and release individually.

## Java support

Sub-projects build and release individually and each declares its own minimum Java
version, so there is no single repository-wide baseline. The CI build
(`.github/workflows/maven-ci.yml`) compiles and tests the covered sub-projects on
**Java 17, 21, 23 and 25**.

### Security Manager

The **Apache Felix Framework** no longer supports the OSGi security layer. Java SE 24
permanently disabled the Security Manager
([JEP 486](https://openjdk.org/jeps/486)), so permission checks can no longer be
enforced and `System.setSecurityManager` throws. Accordingly:

- Launching the framework with the `org.osgi.framework.security` property now fails
with a `SecurityException` rather than silently starting without the requested
security.
- `Bundle.hasPermission(...)` returns `true` unless a `SecurityProvider` is installed.
- The OSGi permission API (`AdminPermission`, `ServicePermission`, `PackagePermission`,
and friends) is still exported, so bundles referring to those types keep compiling
and resolving.
- The `org.apache.felix.framework.security` sub-project has been removed.

If you need the security layer, stay on a release that predates this change and run it
on Java 21 or earlier.

## Felix Framework

The flagship project is the **Apache Felix Framework** which implements the [**OSGi Core R7**](https://osgi.org/specification/osgi.core/7.0.0/) specification. The `/framework` directory contains the source and build tree for the **OSGi**-compliant
Expand Down
21 changes: 18 additions & 3 deletions bundlerepository/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<parent>
<groupId>org.apache.felix</groupId>
<artifactId>felix-parent</artifactId>
<version>2.1</version>
<version>9</version>
<relativePath>../pom/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
Expand Down Expand Up @@ -100,15 +100,30 @@
<version>3.4</version>
<scope>test</scope>
</dependency>
<!-- felix-parent 2.1 supplied junit and mockito-all to every module; from
felix-parent 9 on they have to be declared here. mockito-all 1.x could not
generate classes on JDK 25 anyway, so mockito-core is used instead. -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.18.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.5</target>
<source>1.5</source>
<target>8</target>
<source>8</source>
</configuration>
</plugin>

Expand Down
13 changes: 12 additions & 1 deletion configadmin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<parent>
<groupId>org.apache.felix</groupId>
<artifactId>felix-parent</artifactId>
<version>6</version>
<version>9</version>
<relativePath />
</parent>

Expand Down Expand Up @@ -257,6 +257,17 @@
<exclude>**/cm/*</exclude>
<exclude>**/cm/file/*</exclude>
<exclude>**/cm/impl/**</exclude>
<!--
ConfigAdminSecurityTest launches a framework with
org.osgi.framework.security set, so Felix.init calls
System.setSecurityManager. That has thrown
UnsupportedOperationException 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). The test therefore cannot run on any JDK
this project builds with apart from 17.
-->
<exclude>**/integration/ConfigAdminSecurityTest.java</exclude>
</excludes>
<includes>
<include>**/integration/*</include>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,13 +146,16 @@ synchronized void start()
* initiated will not be processed any more. This method does nothing if
* the worker thread is not currently active.
* <p>
* If the worker thread does not terminate within 5 seconds it is killed
* by calling the (deprecated) <code>Thread.stop()</code> method. It may
* be that the worker thread may be blocked by a deadlock (it should not,
* though). In this case hope is that <code>Thread.stop()</code> will be
* able to released that deadlock at the expense of one or more tasks to
* not be executed any longer.... In any case an ERROR message is logged
* with the LogService in this situation.
* If the worker thread does not terminate within 5 seconds it is
* interrupted. It may be that the worker thread is blocked by a deadlock
* (it should not, though); interrupting it releases the thread if it is
* waiting on an interruptible operation, at the expense of one or more
* tasks not being executed any longer. In any case an ERROR message is
* logged with the LogService in this situation.
* <p>
* This used to call <code>Thread.stop()</code>, which has thrown
* <code>UnsupportedOperationException</code> since Java 20 and so could
* only turn a slow shutdown into a failed one.
*/
synchronized void terminate()
{
Expand All @@ -176,9 +179,9 @@ synchronized void terminate()
if ( workerThread.isAlive() )
{
Log.logger.log( LogService.LOG_ERROR,
"Worker thread {0} did not terminate within 5 seconds; trying to kill", new Object[]
"Worker thread {0} did not terminate within 5 seconds; interrupting it", new Object[]
{ workerBaseName } );
workerThread.stop();
workerThread.interrupt();
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions connect/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<parent>
<groupId>org.apache.felix</groupId>
<artifactId>felix-parent</artifactId>
<version>5</version>
<version>9</version>
<relativePath>../pom/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
Expand Down Expand Up @@ -97,8 +97,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.6</target>
<source>1.6</source>
<target>8</target>
<source>8</source>
</configuration>
</plugin>
<plugin>
Expand Down
4 changes: 2 additions & 2 deletions examples/extenderbased.circle/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
Expand Down
4 changes: 2 additions & 2 deletions examples/extenderbased.square/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
Expand Down
4 changes: 2 additions & 2 deletions examples/extenderbased.triangle/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
Expand Down
Loading
Loading