This is an automated email from the ASF dual-hosted git repository. royteeuwen pushed a commit to branch feature/osgi-bsn-collision-detection in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-launcher.git
commit 91efd4dc66f091c09ebc8e3f3953ea1246f99706 Author: Roy Teeuwen <[email protected]> AuthorDate: Tue May 26 21:12:55 2026 +0200 SLING-13217: Add BSN collision detection from feature-core --osgi-bsn-collision-detection CLI flag --- pom.xml | 8 +++++++- .../feature/launcher/impl/FeatureProcessor.java | 1 + .../sling/feature/launcher/impl/LauncherConfig.java | 21 +++++++++++++++++++++ .../apache/sling/feature/launcher/impl/Main.java | 17 +++++++++++++++-- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 24d756f..e9eef80 100644 --- a/pom.xml +++ b/pom.xml @@ -96,6 +96,12 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> + <configuration> + <!-- MainIT.setUp() calls System.setSecurityManager, which throws on JDK 17+ + unless the SecurityManager is explicitly allowed. The Security Manager + is deprecated for removal but remains functional behind this opt-in. --> + <argLine>-Djava.security.manager=allow</argLine> + </configuration> <executions> <execution> <goals> @@ -265,7 +271,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.feature</artifactId> - <version>2.0.0</version> + <version>2.0.6</version> <scope>compile</scope> </dependency> <dependency> diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java b/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java index fd3f16e..45d2438 100644 --- a/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java +++ b/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java @@ -96,6 +96,7 @@ public class FeatureProcessor { builderContext.addConfigsOverrides(config.getConfigClashOverrides()); builderContext.addVariablesOverrides(config.getVariables()); builderContext.addFrameworkPropertiesOverrides(config.getInstallation().getFrameworkProperties()); + builderContext.setOsgiBsnCollisionDetection(config.isOsgiBsnCollisionDetectionEnabled()); builderContext.addMergeExtensions(StreamSupport.stream(Spliterators.spliteratorUnknownSize( ServiceLoader.load(MergeHandler.class).iterator(), Spliterator.ORDERED), false) .toArray(MergeHandler[]::new)); diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java b/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java index 64b5af6..2bc7248 100644 --- a/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java +++ b/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java @@ -62,6 +62,8 @@ public class LauncherConfig private volatile boolean cacheOnly = false; + private volatile boolean osgiBsnCollisionDetection; + /** * Create a new configuration object. * Set the default values @@ -135,6 +137,25 @@ public class LauncherConfig this.frameworkArtifact = frameworkArtifact; } + /** + * @return whether OSGi {@code Bundle-SymbolicName} collision detection is + * enabled. Maps onto + * {@code BuilderContext.setOsgiBsnCollisionDetection(boolean)}. + * Default {@code false}. + * + * @since 1.4.0 + */ + public boolean isOsgiBsnCollisionDetectionEnabled() { + return osgiBsnCollisionDetection; + } + + /** + * @since 1.4.0 + */ + public void setOsgiBsnCollisionDetection(final boolean enabled) { + this.osgiBsnCollisionDetection = enabled; + } + /** * Set the feature id for the launch feature * @param id The id diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java index 478f8c0..abb5527 100644 --- a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java +++ b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java @@ -67,6 +67,8 @@ public class Main { public static final String OPT_REPOSITORY_URLS = "u"; + public static final String OPT_OSGI_BSN_COLLISION_DETECTION = "osgi-bsn-collision-detection"; + public static final String OPT_CONFIG_CLASH = "CC"; public static final String OPT_ARTICACT_CLASH = "C"; @@ -253,11 +255,17 @@ public class Main { .build(); final Option printInsideContainerHelp = Option.builder(OPT_PRINT_CONTAINER_ENV_HELP) - + .desc("print additional help information for container env vars.") .optionalArg(true) .build(); - + + final Option osgiBsnCollisionDetectionOption = Option.builder() + .longOpt(OPT_OSGI_BSN_COLLISION_DETECTION) + .desc("Enable OSGi Bundle-SymbolicName collision detection during aggregation. " + + "Resolved via -C *:*:<rule> overrides or fails the build. Off by default.") + .build(); + options = new Options().addOption(artifactClashOverride) .addOption(configClashOverride) .addOption(repoOption) @@ -272,6 +280,7 @@ public class Main { .addOption(extensionConfiguration) .addOption(frameworkVersionOption) .addOption(frameworkArtifactOption) + .addOption(osgiBsnCollisionDetectionOption) .addOption(printInsideContainerHelp); @@ -347,6 +356,10 @@ public class Main { extractValueFromOption(cl, OPT_OSGI_FRAMEWORK_ARTIFACT) .ifPresent(config::setFrameworkArtifact); + if (cl.hasOption(OPT_OSGI_BSN_COLLISION_DETECTION)) { + config.setOsgiBsnCollisionDetection(true); + } + } catch (final ParseException pe) { Main.LOG().error("Unable to parse command line: {}", pe.getMessage(), pe);
