code: @Override
    public SparkAppHandle startApplication(SparkAppHandle.Listener... listeners) throws IOException {
      if (builder.isClientMode(builder.getEffectiveConfig())) {
        LOG.warning("It's not recommended to run client-mode applications using InProcessLauncher.");
      }
  
      Method main = findSparkSubmit();
      LauncherServer server = LauncherServer.getOrCreateServer();
      InProcessAppHandle handle = new InProcessAppHandle(server);
      for (SparkAppHandle.Listener l : listeners) {
        handle.addListener(l);
      }
  
      String secret = server.registerHandle(handle);
      setConf(LauncherProtocol.CONF_LAUNCHER_PORT, String.valueOf(server.getPort()));
      setConf(LauncherProtocol.CONF_LAUNCHER_SECRET, secret);
  
      List<String> sparkArgs = builder.buildSparkSubmitArgs();
      String[] argv = sparkArgs.toArray(new String[sparkArgs.size()]);
  
      String appName = CommandBuilderUtils.firstNonEmpty(builder.appName, builder.mainClass,
        "<unknown>");
      handle.start(appName, main, argv);
      return handle;
    }
docs: Starts a Spark application.
  
  @see AbstractLauncher#startApplication(SparkAppHandle.Listener...)
  @param listeners Listeners to add to the handle before the app is launched.
  @return A handle for the launched application.