Java Scala REPL仅以root用户身份运行,以非root用户身份运行时出错

Java Scala REPL仅以root用户身份运行,以非root用户身份运行时出错,java,scala,Java,Scala,我运行的是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

我运行的是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.
[init]错误:加载时出错,打开zip文件时出错
未能初始化编译器:找不到对象scala。
**请注意,从2.8开始,scala不假定使用java类路径。
**对于旧的行为,将-usejavacp传递给scala,或者如果使用设置
**对象编程设置为settings.usejavacp.value=true。
我试图运行scala-usejavacp,但没有任何帮助。 我在许多其他发行版中经常使用Scala,以前从未遇到过这个错误

我的OpenSUSE安装已经安装了OpenJDK 6

请提出您的意见,谢谢

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

  • 安装Oracle JDK 1.7并运行scala,确认scala REPL报告在hotspot JVM 1.7中运行,出现相同错误
  • 已安装sbt并从sbt运行“控制台”,出现相同错误
  • strace和diff作为普通用户,sudo scala和scala之间的输出没有区别,除了上面的错误消息
  • scala-Ylog类路径作为su和普通用户,然后区分输出,如上所述
  • 已禁用AppArmor并重试,出现相同的错误消息
  • 下载其他scala版本(所有2.9x和2.10 milestone 4),它们的所有REPL都会给出相同的错误消息
  • 确保在scala REPL运行之前fsc未运行
  • 确保主机名是可解析的
  • 这是一个非常有趣的问题,如果我能幸运地找到它,我一定会发布一个解决方案

    非常感谢你的帮助

    上次编辑:
    谢谢大家在这里和reddit上(http://www.reddit.com/r/scala/comments/w5s0m/please_help_scala_only_runs_as_root_user_gives/)他提出了非常有价值的建议来帮助我解决这个非常奇怪的问题。有关解决方案,请参见下面的答案。

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

    看起来它无法打开`SCALA library.jar',或REPL所需的其他jar文件

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


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

    我刚刚找到了原因:

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

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

    scala二进制文件世界和可执行文件是吗?是的。755适用于所有DIR和scala可执行文件,644适用于所有其他文件您的设备上是否启用了SELinux?否。。SUSE中有一个AppArmor,禁用AppArmor并不能很遗憾地改善这种情况。谢谢,但是lib目录中没有sbt-launch.jar。jar不在官方网站的scala发行版中。类似这样的问题是我的问题,因为我在IntelliJ中打开了多个模块,每个模块都有不同的依赖项,它们相互冲突。谢谢。在我的其他尝试之后,这似乎毕竟不是一个权限问题,因为即使从OpenSUSE的java repo安装scala也不能解决问题,并且将scala dir中的所有内容设置为777也没有帮助。。。strace-f不显示文件系统读取失败或权限拒绝。。。也许opensuse不喜欢scala@HowardGuo你没有说scalac是否有同样的问题。@HowardGuo试试fsc。fsc使用后台守护进程,通过TCP端口与前台编译器对话,因此如果由于某种原因无法打开侦听端口,它可能会失败。这可能是因为您的
    hostname
    未解析为有效的可绑定IP,或对可绑定端口的某些SELinux限制。我认为REPL可能会使用类似的用法。:(仍然不起作用,我想scala只是不喜欢suse