“ sbt服务器已经启动。”从wsl2 ubuntu启动sbt时出错

时间:2020-11-12 17:48:43

标签: sbt wsl-2

我已经在wsl2 ubuntu设置中使用sdkman安装了sbt。当前已安装sbt 1.4.2。当我尝试从终端启动它时 sbt server is already booting. Create a new server? y/n (default y)如果我选择n,则什么也不会发生。如果我选择y,则sbt开始。我想要做的是能够在没有该错误消息的情况下启动sbt。因为这种行为会破坏Visual Studio代码上的金属。

我检查了sbt源代码,发现下面的方法会打印错误消息-在sbt/main/src/main/scala/sbt/Main.scala

private def getSocketOrExit(
      configuration: xsbti.AppConfiguration
  ): (Option[BootServerSocket], Option[Exit]) =
    try (Some(new BootServerSocket(configuration)) -> None)
    catch {
      case _: ServerAlreadyBootingException
          if System.console != null && !ITerminal.startedByRemoteClient =>
        println("sbt server is already booting. Create a new server? y/n (default y)")
        val exit = ITerminal.get.withRawInput(System.in.read) match {
          case 110 => Some(Exit(1))
          case _   => None
        }
        (None, exit)
      case _: ServerAlreadyBootingException =>
        if (SysProp.forceServerStart) (None, None)
        else (None, Some(Exit(2)))
    }
}

因此,调用new BootServerSocket(configuration)会引发异常。异常源是BootServerSocket.java中的以下方法;

static ServerSocket newSocket(final String sock) throws ServerAlreadyBootingException {
    ServerSocket socket = null;
    String name = socketName(sock);
    try {
      if (!isWindows) Files.deleteIfExists(Paths.get(sock));
      socket =
          isWindows
              ? new Win32NamedPipeServerSocket(name, false, Win32SecurityLevel.OWNER_DACL)
              : new UnixDomainServerSocket(name);
      return socket;
    } catch (final IOException e) {
      throw new ServerAlreadyBootingException();
    }
  }

我检查了isWindows方法,它返回false。因此new UnixDomainServerSocket(name)部分正在运行。而且它无法以某种方式创建Unix域服务器套接字。这就是我发现的全部。有没有办法来解决这个问题?还是这是一个错误?

1 个答案:

答案 0 :(得分:0)

将项目文件移动到wsl2中的目录后,问题解决了。我的项目文件以前在Windows目录中。