code: public void launch(boolean eagerSingletonsMode, String[] args) throws Exception {
  		instantOfStart = Instant.now();
  		createInjector(eagerSingletonsMode ? Stage.PRODUCTION : Stage.DEVELOPMENT, args);
  		logger.info("=== INJECTING DEPENDENCIES");
  		try {
  			onStart();
  			try {
  				doStart();
  				logger.info("=== RUNNING APPLICATION");
  				instantOfRun = Instant.now();
  				run();
  			} catch (Throwable e) {
  				applicationError = e;
  				throw e;
  			} finally {
  				instantOfStop = Instant.now();
  				doStop();
  			}
  		} catch (Exception e) {
  			if (applicationError == null) applicationError = e;
  			logger.error("Application failure", e);
  			throw e;
  		} finally {
  			onStop();
  			instantOfComplete = Instant.now();
  			finishLatch.countDown();
  		}
  	}
docs: Launch application following few simple steps:
  <ul>
  <li>Inject dependencies</li>
  <li>Starts application, {@link Launcher#onStart()} is called in this stage</li>
  <li>Runs application, {@link Launcher#run()} is called in this stage</li>
  <li>Stops application, {@link Launcher#onStop()} is called in this stage</li>
  </ul>
  You can override methods mentioned above to execute your code in needed stage.
  
  @param args                program args that will be injected into @Args string array
  @param eagerSingletonsMode passed to Guice