我尝试用 java 编译 Hello world 示例,但出现 gcc 错误。据我了解,gcc 正在尝试编译我的 java 类(并且由于某种原因未能找到 main 方法,但这不是重点)。
我有 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
命令按照目录列出的顺序查找。就您而言,从您的描述来看,很可能没有/home/rumtscho/bin/javac
,没有/usr/local/bin/javac
,但是 a/usr/bin/javac
是 GCC Java 编译器(或其符号链接)。
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