in src/main/java/org/apache/sling/feature/launcher/impl/Main.java [153:357]
protected static void parseArgs(final LauncherConfig config, final String[] args) {
final Option artifactClashOverride = Option.builder(OPT_ARTICACT_CLASH)
.longOpt("artifact-clash")
.desc("Set artifact clash override")
.optionalArg(true)
.numberOfArgs(Option.UNLIMITED_VALUES)
.build();
final Option configClashOverride = Option.builder(OPT_CONFIG_CLASH)
.longOpt("config-clash")
.desc("Set config clash override")
.optionalArg(true)
.numberOfArgs(Option.UNLIMITED_VALUES)
.build();
final Option repoOption = Option.builder(OPT_REPOSITORY_URLS)
.longOpt("repository-urls")
.desc("Set repository urls")
.optionalArg(true)
.valueSeparator(',')
.numberOfArgs(Option.UNLIMITED_VALUES)
.build();
final Option featureOption = Option.builder(OPT_FEATURE_FILES)
.longOpt("feature-files")
.desc("Set feature files")
.optionalArg(true)
.valueSeparator(',')
.numberOfArgs(Option.UNLIMITED_VALUES)
.build();
final Option featureIdOption = Option.builder(OPT_LAUNCH_FEATURE_ID)
.longOpt("launch-feature-id")
.desc("Set the id for the launch feature")
.optionalArg(true)
.numberOfArgs(1)
.build();
final Option fwkProperties = Option.builder(OPT_FRAMEWORK_PROPERTIES)
.longOpt("framework-property")
.desc("Set framework property, format: -D key1=val1 -D key2=val2")
.hasArg()
.optionalArg(true)
.build();
final Option varValue = Option.builder(OPT_VARIABLE_VALUES)
.longOpt("variable-value")
.desc("Set variable value, format: -V key1=val1 -V key2=val2")
.optionalArg(true)
.numberOfArgs(Option.UNLIMITED_VALUES)
.build();
final Option debugOption = Option.builder(OPT_VERBOSE)
.longOpt("verbose")
.desc("Verbose")
.optionalArg(true)
.numberOfArgs(1)
.build();
final Option cacheOnlyOption = Option.builder(OPT_CACHE_ONLY)
.longOpt("cacheOnly")
.desc("Cache only the required dependencies. Don't start the framework.")
.optionalArg(true)
.build();
final Option cacheOption = Option.builder(OPT_CACHE_DIR)
.longOpt("cache_dir")
.desc("Set cache dir")
.optionalArg(true)
.numberOfArgs(1)
.build();
final Option homeOption = Option.builder(OPT_HOME_DIR)
.longOpt("home_dir")
.desc("Set home dir")
.optionalArg(true)
.numberOfArgs(1)
.build();
final Option extensionConfiguration = Option.builder(OPT_EXTENSION_CONFIGURATION)
.longOpt("extension_configuration")
.desc("Provide extension configuration, format: extensionName:key1=val1,key2=val2")
.optionalArg(true)
.numberOfArgs(Option.UNLIMITED_VALUES)
.build();
final Option frameworkVersionOption = Option.builder(OPT_FELIX_FRAMEWORK_VERSION)
.longOpt("felix-framework-version")
.desc("Set Apache Felix framework version (default "
.concat(Bootstrap.FELIX_FRAMEWORK_VERSION) + ")")
.optionalArg(true)
.numberOfArgs(1)
.build();
final Option frameworkArtifactOption = Option.builder(OPT_OSGI_FRAMEWORK_ARTIFACT)
.longOpt("osgi-framework-artifact")
.desc("Set OSGi framework artifact (overrides Apache Felix framework version)")
.optionalArg(true)
.numberOfArgs(1)
.build();
final Option printInsideContainerHelp = Option.builder(OPT_PRINT_CONTAINER_ENV_HELP)
.desc("print additional help information for container env vars.")
.optionalArg(true)
.build();
options = new Options().addOption(artifactClashOverride)
.addOption(configClashOverride)
.addOption(repoOption)
.addOption(featureOption)
.addOption(featureIdOption)
.addOption(fwkProperties)
.addOption(varValue)
.addOption(debugOption)
.addOption(cacheOnlyOption)
.addOption(cacheOption)
.addOption(homeOption)
.addOption(extensionConfiguration)
.addOption(frameworkVersionOption)
.addOption(frameworkArtifactOption)
.addOption(printInsideContainerHelp);
final CommandLineParser clp = new DefaultParser();
try {
final CommandLine cl = clp.parse(options, args);
extractValuesFromOption(cl, OPT_REPOSITORY_URLS).ifPresent(
values -> config.setRepositoryUrls(values.stream().toArray(String[]::new)));
extractValuesFromOption(cl, OPT_ARTICACT_CLASH).ifPresent(values -> values
.forEach(v -> config.getArtifactClashOverrides().add(ArtifactId.parse(v))));
extractValuesFromOption(cl, OPT_CONFIG_CLASH).orElseGet(ArrayList::new)
.forEach(value -> {
final String[] keyVal = split(value);
config.getConfigClashOverrides().put(keyVal[0], keyVal[1]);
});
extractValuesFromOption(cl, OPT_FRAMEWORK_PROPERTIES).orElseGet(ArrayList::new)
.forEach(value -> {
final String[] keyVal = split(value);
config.getInstallation().getFrameworkProperties().put(keyVal[0], keyVal[1]);
});
extractValuesFromOption(cl, OPT_VARIABLE_VALUES).orElseGet(ArrayList::new)
.forEach(value -> {
final String[] keyVal = split(value);
config.getVariables().put(keyVal[0], keyVal[1]);
});
if (cl.hasOption(OPT_VERBOSE)) {
extractValueFromOption(cl, OPT_VERBOSE, "debug").ifPresent(value -> {
if (isLoglevel(value)) {
System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", value);
}
});
} // if not the `org.slf4j.simpleLogger.defaultLogLevel` is by default `info`
if (cl.hasOption(OPT_CACHE_ONLY)) {
config.setCacheOnly(true);
}
extractValuesFromOption(cl, OPT_FEATURE_FILES).orElseGet(ArrayList::new)
.forEach(config::addFeatureFiles);
extractValueFromOption(cl, OPT_LAUNCH_FEATURE_ID)
.ifPresent(config::setLaunchFeatureId);
extractValueFromOption(cl, OPT_CACHE_DIR).map(File::new)
.ifPresent(config::setCacheDirectory);
extractValueFromOption(cl, OPT_HOME_DIR).map(File::new)
.ifPresent(config::setHomeDirectory);
extractValuesFromOption(cl, OPT_EXTENSION_CONFIGURATION)
.ifPresent(values -> values.forEach(v -> {
Map.Entry<String, Map<String, String>> xc = splitMap2(v);
Map<String, Map<String, String>> ec = config.getExtensionConfiguration();
Map<String, String> c = ec.get(xc.getKey());
if (c == null) {
c = new HashMap<>();
ec.put(xc.getKey(), c);
}
c.putAll(xc.getValue());
}));
extractValueFromOption(cl, OPT_FELIX_FRAMEWORK_VERSION)
.ifPresent(config::setFrameworkVersion);
extractValueFromOption(cl, OPT_OSGI_FRAMEWORK_ARTIFACT)
.ifPresent(config::setFrameworkArtifact);
} catch (final ParseException pe) {
Main.LOG().error("Unable to parse command line: {}", pe.getMessage(), pe);
printHelp();
System.exit(1);
}
}