docs: public void run() {
          try {
              stopServer(); // first, stop server
  
              // wait on error/output stream threads to complete
              // note on Windows the streams never close, so wait with brief timeout
              if (!System.getProperty("os.name").startsWith("Win")) {
                  out.join();
                  err.join();
              } else { // windows, so use timeout
                  out.join(500);
                  err.join(500);
              }
  
              startAsyncDelete(); // now launch async process to cleanup extraction directory
  
          } catch (Exception e) {
              throw new RuntimeException("Shutdown hook failed with exception " + e.getMessage());
          }
  
      }