3

在为 windows 下载 scala 2.10.2 并运行 scala 后,我遇到了这样的错误:

"错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner"

这意味着“错误:无法找到或加载主类 scala.tools.nsc.MainGenericRunner”。所以我检查了scala.bat原因,我发现了这样的功能:

:set_home
  set _BIN_DIR=
  for %%i in (%~sf0) do set _BIN_DIR=%_BIN_DIR%%%~dpsi
  echo in set_home: %_BIN_DIR%
  set _SCALA_HOME=%_BIN_DIR%..
goto :eof

在这个函数之后 _SCALA_HOME 变成D:\program files\scala\files\scala\bin\..,这显然是错误的。无论如何,在将 _SCALA_HOME 设置为正确路径后,错误已修复。但是,有谁知道这个功能真正想要做什么%~sf0和意思以及什么?%%~dpsi谢谢!


谢谢@gourlaysama

我终于找到了真正的原因:执行下面的代码,你可以看到结果是:

  for %%i in (%~sf0) do (
    echo "%%"i is: %%i
    echo sf0 is : %%~dpsi
    set _BIN_DIR=%_BIN_DIR%%%~dpsi
    )

输出:

"%"i is: D:\program
sf0 is : D:\
"%"i is: files\scala\bin\scala.bat
sf0 is : D:\program files\scala\bin\files\scala\bin\

所以故障是由于之间的额外空间造成的program files

4

3 回答 3

2

那些奇怪的变量被称为参数扩展。它们允许您将变量解释为文件/目录的路径,并直接从该路径解析事物。

例如,如果%1是文件的路径dir123456\file.txt

  • %~f1是完全合格的路径file.txt
  • %~p1是包含目录的路径dir123456
  • %~s1是短名称格式的路径dir123~1\file.txt
  • 和许多其他人......

此外,%0始终设置为当前运行脚本的路径。所以:

  • %~fs0是当前脚本的全限定路径,以短名称格式,
  • %%~dpsi是将FOR变量手动扩展为%%i驱动器号 ( doption),后跟包含文件夹的路径 ( poption),格式为短格式 ( soption)。

现在,这个看起来很奇怪的代码块是KB833431的一种解决方法,其中该%~dps0命令不会您提供当前脚本文件夹的路径(短格式),尽管它应该。这已在 XP SP2 中修复。

它似乎正在手动重建从完全限定路径到 scalabin目录的完全限定路径scala.bat,然后只获取该目录的父目录,这应该是有效的_SCALA_HOME.

于 2013-08-31T13:57:53.953 回答
1

如果您尝试创建一个不允许在目录中包含空格的环境变量,则需要使用 Window 的缩短路径名。

不要使用“C:\Program Files\scala...”,而是使用“C:\Progra~1\scala...”。

不要使用“C:\Program Files (x86)\scala...”,而是使用“C:\Progra~2\scala...”。

否则,

这家伙找到了解决方案: https ://issues.scala-lang.org/browse/SI-7821

解决方案: 在此处输入图像描述

要对他谈到的批处理文件进行更改,请下载 Notepad++

然后右键单击 NotePad++ 并选择“以管理员身份运行”或“以 PowerBroker 管理员身份运行”。

在此处输入图像描述

在 NotePad++ 中打开一个新文件

在此处输入图像描述

导航到您的 scala/bin/scala.bat 文件目录并选择 scala.bat

在此处输入图像描述

将代码更改为上述链接所说的内容。所以最终的结果应该是这样的:

在此处输入图像描述

为 scala/bin 文件夹中的所有 .bat 文件更改 :add_cpath 和 :set_home 。

现在打开命令提示符并输入“scala -version”或只是“scala”

于 2016-08-08T23:06:56.400 回答
0

在 Windows 10 格式化的新卷中安装 Scala 后,我遇到了同样的错误。

解决方法是将 Scala 安装到没有空格的路径。例如D:\scala

scala.bat使用 8.3 文件名进行设置_SCALA_HOME,但 NTFS 卷上的 8.3 文件名生成可以通过选项禁用(现在似乎是默认设置)。

要检查是否启用了 8.3 文件名生成,请运行dir /x并查看短文件/文件夹名称是否显示在长名称旁边。

C:\>dir /x
2016/04/19  08:26    <DIR>          PROGRA~1     Program Files
D:\>dir /x
2016/04/19  14:38    <DIR>                       Program Files

或者fsutil 8dot3name在管理员命令提示符下使用命令(替换D:为您的安装驱动器。TechNet 文档):

fsutil 8dot3name query D:
于 2016-04-19T06:08:07.503 回答