code: def _start_process(self, classpath):
          
          cache_dir = self.config['cache-dir']
          java_flags = self.config['java-flags']
          iswindows = os.name == 'nt'
  
          Util.mkdir_p(cache_dir)
          log_path = os.path.join(cache_dir, "server.log")
          log = open(log_path, "w")
          null = open(os.devnull, "r")
          java = os.path.join(self.config['java-home'], 'bin', 'java.exe' if iswindows else 'java')
  
          if not os.path.exists(java):
              raise InvalidJavaPathError(errno.ENOENT, 'No such file or directory', java)
          elif not os.access(java, os.X_OK):
              raise InvalidJavaPathError(errno.EACCES, 'Permission denied', java)
  
          args = (
              [java, "-cp", (';' if iswindows else ':').join(classpath)] +
              [a for a in java_flags if a] +
              ["-Densime.config={}".format(self.config.filepath),
               "org.ensime.server.Server"])
          process = subprocess.Popen(
              args,
              stdin=null,
              stdout=log,
              stderr=subprocess.STDOUT)
          pid_path = os.path.join(cache_dir, "server.pid")
          Util.write_file(pid_path, str(process.pid))
  
          def on_stop():
              log.close()
              null.close()
              with catch(Exception):
                  os.remove(pid_path)
  
          return EnsimeProcess(cache_dir, process, log_path, on_stop)
docs: Given a classpath prepared for running ENSIME, spawns a server process
          in a way that is otherwise agnostic to how the strategy installs ENSIME.
  
          Args:
              classpath (list of str): list of paths to jars or directories
              (Within this function the list is joined with a system dependent
              path separator to create a single string argument suitable to
              pass to ``java -cp`` as a classpath)
  
          Returns:
              EnsimeProcess: A process handle for the launched server.