【问题标题】:Scala REPL only runs as root user, gives error when run as non-rootScala REPL 仅以 root 用户身份运行,以非 root 用户身份运行时出错
【发布时间】:2012-07-07 00:22:53
【问题描述】:

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

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

非常感谢您的帮助!

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

【问题讨论】:

  • scala 二进制文件世界和可执行文件吗?
  • 是的。所有 dirs 和 scala 可执行文件为 755,所有其他文件为 644
  • 你的机器上是否启用了 SELinux?
  • no.. SUSE 中有一个 AppArmor,不幸的是,禁用 AppArmor 并没有改善这种情况。

标签: java scala


【解决方案1】:

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

【讨论】:

  • 谢谢,lib目录下没有sbt-launch.jar。 jar 不在官网的 scala 发行版中。
  • 这样的事情原来是我的问题,因为我在 IntelliJ 中打开了多个模块,每个模块都有不同的依赖项,而且它们相互冲突。
【解决方案2】:

我刚刚找到原因:

作为普通用户仔细检查“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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢。在我的其他尝试之后,它似乎毕竟不是权限问题,因为即使从 OpenSUSE 的 java repo 安装 scala 也不能解决问题,并且将 scala dir 中的所有内容设置为 777 也无济于事...... strace -f不显示文件系统读取失败或权限被拒绝...也许 opensuse 不喜欢 scala
    • @HowardGuo 你没说scalac有没有同样的问题。
    • @HowardGuo 试试 fsc。 fsc 使用后台守护进程通过 TCP 端口与前台编译器对话,因此如果由于某种原因无法打开侦听端口,它可能会失败。这可能是因为您的hostname 无法解析为有效的、可绑定的 IP 或 SELinux 对可绑定端口的限制。我认为 REPL 可能使用类似的东西。
    • :( 还是不行,我猜 scala 根本不喜欢 suse
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-08
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2017-04-07
      • 2013-07-02
      • 2017-02-06
      相关资源
      最近更新 更多