これはかなり奇妙です。問題はjava
、非特権ユーザーとして実行すると、「.class」ファイルを見つけたり読み取ったりできないことです。ただし、「root」として実行すると、できます。
これは、「HelloWorld.class」ファイルを間違った所有者および/または間違った権限で作成したことを示唆しています。
を実行して権限を確認しますls -l HelloWorld.class
。所有者はユーザー アカウント ("root" ではありません) である必要があり、ファイルに対するユーザー読み取り権限が必要です。
他に考えられる説明をいくつか示します。
あなたが実行しているjava
コマンドは、あなたが思っているものではないかもしれません。which java
自分で実行したときに何が表示されるかを確認してください。それが「実際の」java
実行可能ファイルであり、現在のディレクトリまたはルート/ sudo にない他のディレクトリにあるスクリプトや何かではないことを確認してください$PATH
。
CLASSPATH
現在のディレクトリ(「HelloWorld.class」が...と思われる場所)がクラスパス上にないように環境変数を設定している可能性があります。ただし、設定されていない環境でコマンドが実行されてsudo java
いる場合。その場合、引数がない場合は、;だけで構成されるデフォルトのクラスパスが取得されます。つまり、現在のディレクトリ。java
$CLASSPATH
-cp
"."
問題が CLASSPATH 環境変数であることが判明した場合は、設定を解除することをお勧めします...そして、シェルの「rc」ファイルを編集して設定を解除することもお勧めします。
java
代わりに、コマンド、コマンドなどで「-cp」コマンドを使用し、javac
Ant または Maven または IDE に切り替えて、コードをビルドおよび実行します。(または、アプリケーション ランチャーとしていくつかの小さなラッパー スクリプトを作成することもできます。)
CLASSPATH 環境変数に依存しません。特にコーディングプロジェクトを切り替える場合は、厄介な驚きをもたらす可能性があります. (確かに、本番環境ではそれに依存しないでください!)