SLING-11814: Add support for the -CO / --cacheOnly flag which only downloads the required dependency artifacts and does not actually start the framework
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java b/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
index 8e9201b..e094748 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
@@ -160,6 +160,11 @@
                         this.config.getLocalArtifacts(), this.config.getCachedArtifacts(),
                         this.config.getDownloadedArtifacts());
 
+                if (this.config.getCacheOnly()) {
+                    this.logger.info("Finished downloading any requirements...exiting!");
+                    System.exit(0);
+                }
+
                 if (restart) {
                     this.config.getInstallation().getInstallableArtifacts().clear();
                     this.config.getInstallation().getConfigurations().clear();
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 29bd393..64b5af6 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
@@ -60,6 +60,8 @@
 
     private volatile ArtifactId launchFeatureId;
 
+    private volatile boolean cacheOnly = false;
+
     /**
      * Create a new configuration object.
      * Set the default values
@@ -149,4 +151,12 @@
     public ArtifactId getLaunchFeatureId() {
         return this.launchFeatureId;
     }
+
+    public boolean getCacheOnly() {
+        return this.cacheOnly;
+    }
+
+    public void setCacheOnly(final boolean value) {
+        this.cacheOnly = value;
+    }
 }
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 1756774..478f8c0 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
@@ -75,6 +75,8 @@
 
     public static final String OPT_LAUNCH_FEATURE_ID = "i";
 
+    public static final String OPT_CACHE_ONLY = "CO";
+
     private static Logger LOGGER;
 
     private static Options options;
@@ -208,6 +210,12 @@
                 .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")
@@ -258,6 +266,7 @@
                 .addOption(fwkProperties)
                 .addOption(varValue)
                 .addOption(debugOption)
+                .addOption(cacheOnlyOption)
                 .addOption(cacheOption)
                 .addOption(homeOption)
                 .addOption(extensionConfiguration)
@@ -267,6 +276,7 @@
 
         
         final CommandLineParser clp = new DefaultParser();
+
         try {
             final CommandLine cl = clp.parse(options, args);
 
@@ -303,6 +313,10 @@
                 });
             } // 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);