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