diff --git a/oak-segment-tar/pom.xml b/oak-segment-tar/pom.xml
index ff4b6803ef..c846df7bc1 100644
--- a/oak-segment-tar/pom.xml
+++ b/oak-segment-tar/pom.xml
@@ -257,7 +257,14 @@
org.osgi
- osgi.core
+ org.osgi.framework
+ 1.10.0
+ provided
+
+
+ org.osgi
+ org.osgi.util.tracker
+ 1.5.4
provided
@@ -367,7 +374,12 @@
-
+
+ org.hamcrest
+ hamcrest
+ 2.2
+ test
+
junit
junit
@@ -398,6 +410,29 @@
commons-lang3
test
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.10.0
+ test
+
+
+ org.apache.felix
+ org.apache.felix.framework
+ test
+
+
+ org.apache.sling
+ org.apache.sling.testing.osgi-unit
+ 0.0.1-T20240110144927-3d8e9e8f
+ test
+
+
+ org.apache.felix
+ org.apache.felix.scr
+ 2.1.30
+ test
+
org.easymock
easymock
diff --git a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/osgi/SplitPersistenceServiceTest.java b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/osgi/SplitPersistenceServiceTest.java
new file mode 100644
index 0000000000..1e6b923e96
--- /dev/null
+++ b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/osgi/SplitPersistenceServiceTest.java
@@ -0,0 +1,62 @@
+package org.apache.jackrabbit.oak.segment.osgi;
+
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.segment.SegmentNodeStore;
+import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
+import org.apache.jackrabbit.oak.segment.file.FileStore;
+import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
+import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
+import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence;
+import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.sling.testing.osgi.unit.OSGiSupport;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.osgi.framework.FrameworkUtil.asDictionary;
+
+public class SplitPersistenceServiceTest {
+
+ /**
+ * Verifies that a minimally-configured SplitPersistence can be registered successfully
+ */
+ @Test
+ @OSGiSupport(additionalClasses = SplitPersistenceService.class)
+ void bootstrap(@TempDir File roDir, @TempDir File rwDir, BundleContext ctx) throws IOException, InvalidFileStoreVersionException, CommitFailedException, InvalidSyntaxException {
+ SegmentNodeStorePersistence roPersistence = new TarPersistence(roDir);
+
+ FileStore baseFileStore = FileStoreBuilder
+ .fileStoreBuilder(roDir)
+ .withCustomPersistence(roPersistence)
+ .build();
+ SegmentNodeStore base = SegmentNodeStoreBuilders.builder(baseFileStore).build();
+
+ NodeBuilder builder = base.getRoot().builder();
+ builder.child("foo").child("bar").setProperty("version", "v1");
+ base.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ baseFileStore.flush();
+ baseFileStore.close();
+
+ SegmentNodeStorePersistence localPersistence = new TarPersistence(rwDir);
+
+ ctx.registerService(SegmentNodeStorePersistence.class, roPersistence, asDictionary(Map.of("role", "split-persistence-ro")));
+ ctx.registerService(SegmentNodeStorePersistence.class, localPersistence, asDictionary(Map.of("role", "split-persistence-rw")));
+
+ final Collection> serviceReferences = ctx.getServiceReferences(SegmentNodeStorePersistence.class, null);
+ assertThat("No SegmentNodeStorePersistence registered", serviceReferences, notNullValue());
+ assertThat("SegmentNodeStorePersistence registrations different of 3", serviceReferences.size(), is(3));
+ }
+}