1

我正在运行 64 位 OpenSUSE 12.1,今天我从官网下载了最新的 Scala 2.9.2,解压 tgz 并进入 scala-2.9.2/bin 目录后,我执行“scala”并收到此错误消息:

[init] error: error while loading <root>, error in opening zip file

Failed to initialize compiler: object scala not found.
** Note that as of 2.8 scala does not assume use of the java classpath.
** For the old behavior pass -usejavacp to scala, or if using a Settings
** object programatically, settings.usejavacp.value = true.

我试图运行 scala -usejavacp 但它没有帮助。我在许多其他发行版中经常使用 Scala,以前从未遇到过这个错误。

我的 OpenSUSE 安装已安装 OpenJDK 6。

请提出您的意见,谢谢!

我做了以下尝试来解决这个问题:

  1. 安装Oracle JDK 1.7 并运行scala,确认scala REPL 报告在热点JVM 1.7 中运行,出现同样的错误。
  2. 安装 sbt 并从 sbt 运行“控制台”,同样的错误发生。
  3. strace 和 diff 作为普通用户的 sudo scala 和 scala 之间的输出,除了上面的错误消息之外没有任何区别。
  4. scala -Ylog-classpath 作为 su 和普通用户,然后比较输出,同上。
  5. 禁用 AppArmor 并再次尝试,同样的错误消息。
  6. 下载其他 scala 版本(所有 2.9x 和 2.10 里程碑 4),它们的所有 REPL 都给出相同的错误消息。
  7. 确保在 scala REPL 运行之前 fsc 没有运行
  8. 确保主机名是可解析的

嗯,这是一个非常有趣的问题,如果我能幸运地找到它,我肯定会发布一个解决方案。

非常感谢你的帮助!

最后编辑:感谢这里和 reddit 上的所有人 (http://www.reddit.com/r/scala/comments/w5s0m/please_help_scala_only_runs_as_root_user_gives/),他们提供了非常有价值的建议来帮助我解决这个非常奇怪的问题。请参阅下面的答案以获取解决方案。

4

4 回答 4

1

不要将 sbt-launch.jar 放在 $SCALA_HOME/lib 目录、项目的 lib 目录或将放在类路径中的任何位置。

于 2012-07-07T01:45:08.637 回答
1

我刚刚发现了原因:

作为普通用户仔细检查“strace -f scala”的输出会产生一个有趣的输出:

[pid 11919] open("/usr/lib64/jvm/java-1.6.0-openjdk-1.6.0/jre/lib/ext/gnome-java-bridge.jar", O_RDONLY) = -1 EACCES (Permission denied)

紧随其后的是通知用户 scala REPL 初始化失败的系统调用:

[pid 11919] write(1, "\nFailed to initialize compiler: "..., 260

gnome-java-bridge.jar的权限是400,我改成444,问题就解决了!

权限问题似乎已被列为 OpenSUSE 错误: http: //lists.opensuse.org/opensuse-bugs/2012-07/msg00920.html

于 2012-07-10T12:12:28.660 回答
0

看起来它无法打开“scala-library.jar”或 REPL 所需的其他 jar 文件之一。

您没有说 scalac 是否有效。这可能会提供线索。

无论如何,我会确保所有 jar 文件都是 a+r,并且它们所在的目录以及所有其他父目录都是 a+rx。

于 2012-07-08T01:59:09.937 回答
0

这很可能是由 jdk-xxx/jre/lib/ext 包含不可读的 jar 引起的。请查找以“.”开头的文件 jar 和 " ._jar" 并删除它们。

于 2016-03-26T06:28:38.973 回答