JavaでHello Worldの例をコンパイルしようとすると、gccエラーが発生します。私が理解したところ、gccは私のJavaクラスをコンパイルしようとしています(そして何らかの理由でデフォルトのメソッドを見つけることができませんでしたが、それはポイントではありません)。
私はopenSUSE 12.1 64ビットとJDK 1.7(Oracleのrpmからインストール)を使用しています。私の/usr/java/jdk1.7.0_04/bin/:/usr/java/jdk1.7.0_04/
$ PATHにあります。 Javaファイルをコンパイルしようとすると、次の結果が表示されます。
rumtscho@bradbury:/tmp> javac Hello.java
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../lib64/crt1.o:
In function `_start':
/home/abuild/rpmbuild/BUILD/glibc-2.14.1/csu/../sysdeps/x86_64
/elf/start.S:109: undefined reference to `main'
なぜこれが起こり、問題を解決するには?
私の$PATH全体は次のようになります。
rumtscho@bradbury:/tmp> echo $PATH
/home/rumtscho/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:.:/home/rumtscho/bin:/home/rumtscho/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/home/rumtscho/android-sdk-linux/tools:/home/rumtscho/android-sdk-linux/platform-tools:/usr/java/jdk1.7.0_04/bin/:/usr/java/jdk1.7.0_04/:/home/rumtscho/bin:/home/rumtscho/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/home/rumtscho/android-sdk-linux/tools:/home/rumtscho/android-sdk-linux/platform-tools:/usr/java/jdk1.7.0_04/bin/:/usr/java/jdk1.7.0_04/
答え1
$PATH
このコマンドは、リストされた順序でディレクトリを検索します。あなたの説明によると、aはGCC Javaコンパイラ(またはそれへのシンボリックリンク)である可能性が高いです/home/rumtscho/bin/javac
。/usr/local/bin/javac
/usr/bin/javac
SuSEには、複数の実装を含むプログラムを処理する「代理」メカニズムがあります。 ~によるとJava インストールの SuSE ドキュメント、SuSEのJavaパッケージはこのメカニズムを使用します。 Oracleパッケージがこのインタフェースに準拠している場合は、次を実行します。
update-alternatives --config javac
java
好みのJavaコンパイラを選択してください(一致するランタイム環境を選択するには同じことを行う必要があります)。
Oracleバイナリがリストに記載されていない場合は、手動で切り替えることができます。
ln -snf /usr/java/jdk1.7.0_04/bin/{java,javac} /etc/alternatives/
javac
または(代替方法が機能する場合は推奨されません)、ディレクトリ~/bin
(ユーザー固有の設定)または(システム全体の設定)/usr/local/bin
で目的の項目へのシンボリックリンクを作成できます。
ln -s ../../java/jdk1.7.0_04/bin/javac /usr/local/bin
PATH
別のアプローチは、Oracle JDKディレクトリを最初に含めるように順序を変更することです。既に存在する場合は、~/.profile
重複する項目を避けるために削除することができます(終了時にコマンドを見つけるか、そうでないコマンド名を見つけるときを除く)、速度の低下以外は無害です。/usr/java/jdk1.7.0_04/bin
PATH
$PATH
$PATH
prepend_to_path () {
PATH=":$PATH:"
case "$PATH" in
*":$1:"*) PATH="${PATH%%":$1:"*}:${PATH#*":$1:"}";;
esac
PATH="$1${PATH%:}"
}
prepend_to_path /usr/java/jdk1.7.0_04/bin