这是相当奇怪的。似乎问题在于,当您以非特权用户身份运行时,java
它无法找到或读取“.class”文件。但是当以“root”身份运行时,你可以。
这表明您以某种方式设法创建了具有错误所有者和/或错误权限的“HelloWorld.class”文件。
通过运行检查权限ls -l HelloWorld.class
。所有者应该是您的用户帐户(不是“root”),并且您需要对该文件的用户读取权限。
以下是其他一些可能的解释:
您正在运行的java
命令可能不是您认为的那样。which java
当你自己运行它时,检查它的内容。检查它是否是“真正的”java
可执行文件,而不是当前目录或其他目录中的某些脚本或某些东西,这些目录不会位于 root / sudo 上$PATH
。
您可能已经设置了CLASSPATH
环境变量,使得当前目录(我假设“HelloWorld.class”是...)不在类路径上。但是,当您使用 时sudo java
,该命令在未设置java
的环境中运行。$CLASSPATH
在这种情况下,如果没有-cp
参数,您将获得一个默认的类路径,其中仅包含"."
; 即当前目录。
如果问题出在 CLASSPATH 环境变量上,我建议您取消设置它……并编辑您的 shell 的“rc”文件以在此处也取消设置。
相反,在java
命令、javac
命令等上使用“-cp”命令...并切换到 Ant 或 Maven 或 IDE 来构建和运行代码。(或者您可以编写一些小包装脚本作为应用程序启动器。)
不要依赖于 CLASSPATH 环境变量。它可能会给您带来令人讨厌的惊喜,尤其是当您在编码项目之间切换时。(当然不要在你的生产环境中依赖它!)