O que há de errado com a instalação do JDK?

1

Eu tentei compilar um exemplo do mundo Hello em java e recebi um erro do gcc. Tanto quanto eu entendo, o gcc está tentando compilar minha classe java (e por algum motivo não conseguir encontrar o método principal, mas isso é irrelevante).

Tenho o openSUSE 12.1 de 64 bits e o JDK 1.7 (instalado a partir do rpm da Oracle). Eu tenho /usr/java/jdk1.7.0_04/bin/:/usr/java/jdk1.7.0_04/ no meu $ PATH. Quando tento compilar um arquivo java, recebo:

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'

Por que isso está acontecendo e como posso corrigir o problema?

Meu $ PATH completo é:

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/
    
por rumtscho 01.06.2012 / 02:04

1 resposta

2

Os comandos são procurados em $PATH na ordem em que os diretórios são listados. No seu caso, é provável a partir de sua descrição que não há /home/rumtscho/bin/javac , não /usr/local/bin/javac , mas /usr/bin/javac que é o compilador Java do GCC (ou um link simbólico para ele).

O SuSE possui um mecanismo de "alternativas" para lidar com programas que possuem várias implementações. De acordo com a documentação do SuSE sobre a instalação do Java , os pacotes Java do SuSE usam esse mecanismo. Se o pacote do Oracle respeitar essa interface, execute

update-alternatives --config javac

para selecionar seu compilador Java favorito (você deve fazer o mesmo com java para selecionar um ambiente de tempo de execução correspondente).

Se o binário do Oracle não for mencionado na lista, você poderá alternar manualmente para ele:

ln -snf /usr/java/jdk1.7.0_04/bin/{java,javac} /etc/alternatives/

Como alternativa (mas isso não é recomendado se o método de alternativas funcionar), você pode criar um link simbólico para seu javac preferencial no diretório ~/bin (por usuário) ou em /usr/local/bin (todo o sistema configuração).

ln -s ../../java/jdk1.7.0_04/bin/javac /usr/local/bin

Outra maneira seria reordenar seu PATH para ter o diretório do Oracle JDK em primeiro lugar. No seu ~/.profile , adicione /usr/java/jdk1.7.0_04/bin no início do seu PATH . Você pode aproveitar a oportunidade para removê-lo, se ele já estava no $PATH , para evitar entradas duplicadas (que são inofensivas, exceto por uma pequena lentidão ao procurar um comando no final de $PATH ou procurar um não nome do comando existente).

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
    
por 01.06.2012 / 02:54