Gradle encontra JAVA_HOME errado, mesmo que esteja definido corretamente

168

Ao tentar executar o gradle, recebo o seguinte erro:

# gradle

ERROR: JAVA_HOME is set to an invalid directory: /usr/lib/jvm/default-java

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.

No entanto, quando eu checo a variável JAVA_HOME, recebo:

# echo $JAVA_HOME 
/usr/lib/jvm/java-7-oracle

Meu JAVA_HOME está definido em .bashrc e eu verifiquei duas vezes se ele está definido como fonte.

A execução java -versiontambém confirma que JAVA_HOME está definido corretamente e está no PATH.

# java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

Eu também verifiquei se os /usr/bin/javalinks simbólicos aos /etc/alternatives/javaquais, por sua vez, são corretamente links simbólicos para/usr/lib/jvm/java-7-oracle/jre/bin/java

Além disso, verifiquei se não há definições JAVA_HOME duplicadas em .bash_profileou /etc/profile.

Portanto, minha pergunta é como / por que o Gradle encontra /usr/lib/jvm/default-javae, mais importante, como eu o aponto para o diretório correto?

Outros programas que exigem o JDK funcionam bem, então acho que é um problema de Gradle. Também tentei reinstalar o Gradle, o que não fez diferença.

Estou executando o Xubuntu de 64 bits (Ubuntu 13.10 base)

James Barnett
fonte
Forneça a saída de erro completa. Como está, não está claro de onde vem a mensagem. Além disso, você possui um /usr/lib/jvm/default-javadiretório ou link simbólico? E como você instalou o Gradle?
Peter Niederwieser
Atualizei o Q, mas essa é praticamente a saída de erro completa. Não há /usr/lib/jvm/default-javadir. Instalado com apt (apt-get install Gradle)
James Barnett
O script de inicialização Gradle não precisa JAVA_HOMEser definido. Se JAVA_HOMEestiver definido, o script será usado $JAVA_HOME/bin/javapara executar o Gradle. Caso contrário, ele usa java(ou seja, javatem que estar no PATH). Talvez o pacote apt (de terceiros) use um script de início modificado.
Peter Niederwieser
Sim, parece que o ppa do qual eu recebi o binário tinha codificado e exportado o JAVA_HOME para usr/lib/jvm/defult-java. Obrigado pela ajuda
James Barnett
Você fez source ~/.bashrcou reinicializou sua máquina após definir JAVA_HOME?
IgorGanapolsky

Respostas:

263

Acontece que o binário Gradle específico que baixei do próprio repositório Ubuntu 13.10 tenta exportar JAVA_HOME. Obrigado a Lucas por sugerir isso.

/usr/bin/gradle linha 70:

export JAVA_HOME=/usr/lib/jvm/default-java

Comentar essa linha resolve o problema, e Gradle encontra o caminho correto para o binário Java.

Se você acabou de baixar o binário do site deles , ele não tem esse problema, é um problema com a versão repo do Ubuntu. Também parece haver alguns outros problemas com a versão 13.10.

James Barnett
fonte
O pacote gradle parece instalar o jdk nesse local, pelo menos no Ubuntu 12.04 LTS, apenas com os repositórios padrão. Eu fiz isso em uma VM do Ubuntu que não tinha Java, fiz o snapshot primeiro, apt-get install gradle (que instala quase 400 pacotes) e instalou o java em / usr / lib / jvm ... snapshot revertido, no / usr / lib / jvm. Eu estava testando a teoria do script gradle exportando JAVA_HOME e, de fato, como você encontrou.
Joshua McKinnon
2
Gradle não faz isso. O ppa é fornecido por outra pessoa e, portanto, você precisa perguntar a eles. Em geral, eu recomendaria iniciar o Gradle através do Gradle Wrapper, em vez de instalá-lo através de um gerenciador de pacotes.
Peter Niederwieser
Atualizei a resposta para deixar mais claro que a versão do repositório Ubuntu é o problema, não o próprio Gradle.
James Barnett
11
Obrigado, eu procuro por mais de uma hora uma solução para este problema. Obrigado por este post, ele resolve o meu problema no ubuntu 14.04
Kay Schneider
1
Maneira de resolver seu próprio problema (e o meu simultaneamente)! É uma pena que esta pergunta tenha um ano e o script Gradle no repositório não tenha sido atualizado para corrigir isso.
sotrh
49

adicione um link simbólico

sudo ln -s /usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java
Shashi
fonte
@Nar você poderia por favor fornecer o caminho de instalação do JAVA
Shashi
Obrigado pela resposta, mas o caminho do JAVA não importa, porque o script gradle substitui o caminho, como disse James stackoverflow.com/a/22309017/1679348
Nar
5
Funcionou muito bem para mim. Dado o nome ( default-java ), eu diria que essa é uma abordagem bastante sensata.
Phil
2
Na minha opinião, esta é uma solução muito melhor do que alterar os arquivos Gradle. (E sim, ele funciona para mim muito bem)
zorglub76
Obrigado senhor! Você economizou meu tempo!
AlexKh
21

A solução é fazer JAVA_HOME == dir acima da lixeira onde javac mora como em

type javac

javac is /usr/bin/javac   # now check if its just a symlink

ls -la /usr/bin/javac 

/usr/bin/javac -> /etc/alternatives/javac   # its a symlink so check again

ls -la /etc/alternatives/javac  # now check if its just a symlink

/etc/alternatives/javac -> /usr/lib/jvm/java-8-openjdk-amd64/bin/javac

OK, então finalmente encontrei a lixeira acima da javac real, faça isso

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

acima pode ser simplificado e generalizado para

which javac >/dev/null 2>&1 || die "ERROR: no 'javac' command could be found in your PATH"
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac)  )))
Scott Stensland
fonte
13

Para mim, esse erro ocorreu devido ao motivo pelo qual o Gradle foi instalado como sudo e eu estava tentando como usuário padrão executar o Gradle.

Experimentar:

sudo gradle -version

ou

sudo gradle -v
Jyoti Prakash
fonte
7

Tente instalar a versão mais recente do gradle,

sudo add-apt-repository ppa:cwchien/gradle

sudo apt-get update

sudo apt-get install gradle

Se instalarmos a partir do ubuntu repo, ele instalará a versão antiga (para mim era o gradle 1.4). Na versão mais antiga, ele define java home from gradle como export JAVA_HOME=/usr/lib/jvm/default-java. A versão mais recente não possui esse problema.

Mohammed Safeer
fonte
5

Você é exportseu JAVA_HOME? Sem exportação, a configuração não será propagada para os comandos iniciados dentro desse shell. Além disso, java -versionele não usa JAVA_HOME, mas usa o primeiro javaencontrado no seu caminho. Verifique se o seu .bashrcvisual é algo como isto:

JAVA_HOME=/path/to/java/home
export JAVA_HOME
Lucas
fonte
1
Sim, é definido no .bashrc como export JAVA_HOME=/usr/lib/jvm/java-7-oracle(sintaxe um pouco diferente, mas eu suponho que é o mesmo)
James Barnett
3
@ JamesBarnett, o gradlepróprio comando poderia estar definindo essa variável? Talvez a pessoa que instalou tenha gradlecriado um script de wrapper que defina variáveis ​​de ambiente antes de iniciar o aplicativo. Ao usar tomcat, não é incomum para o catalina.sh(que é o script de inicialização) para chamar a um setenv.shpara configurar as variáveis de ambiente que podem incluirJAVA_HOME
Lucas
4

Eu enfrentei esse problema ao executar o seguinte comando no Ubuntu:

ionic build android

Para resolver esse problema, executei as seguintes etapas:

ln -sf /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java /usr/lib/jvm/default-java

Adicione JAVA_HOME a / etc / environment:

vi /etc/environment

Adicionar:

JAVA_HOME="/usr/lib/jvm/default-java"

Após salvar, leia-o:

source /etc/environment

Finalmente, você pode executar o comando build.

Agilox
fonte
4

Eu tive o mesmo problema, mas não encontrei o comando de exportação na linha 70 no arquivo gradle para a versão mais recente 2.13, mas entendo um erro bobo lá, que é o seguinte,

Se você não encontrar a linha 70 com o comando export no arquivo gradle na sua pasta gradle / bin /, verifique seu ~ / .bashrc, se encontrar export JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64/bin/java, remova /bin/java-o desta linha, como JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64, e no caminho >>> disso export PATH=$PATH:$HOME/bin:JAVA_HOME/, será export PATH=$PATH:$HOME/bin:JAVA_HOME/bin/java. Então corra source ~/.bashrc.

O motivo é que, se você verificar seu arquivo gradle, encontrará na linha 70 (se não houver comando de exportação) ou na linha 75,

JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Isso significa que /bin/javajá está lá, então precisa ser subtraído do JAVA_HOMEcaminho.

Isso aconteceu no meu caso.

nada especial
fonte
4

No meu Ubuntu, estou com dor de cabeça por 2 dias nessa questão.

Etapa 1. Digite o terminal whereis java e ele exibirá algo como isto

java: /usr/bin/java /etc/java /usr/share/java /usr/lib/jvm/java-8-openjdk-amd64/bin/java /usr/share/man/man1/java.1.gz

Etapa 2. Anote o caminho: /usr/lib/jvm/java-8-openjdk-amd64/bin/java

excluir o bin/java

seu JAVA_HOME = /usr/lib/jvm/java-8-openjdk-amd64

MJ Montes
fonte
A chave aqui é excluir / bin / java
Borjante
2

Para mim, um problema explícito na seção de argumentos da configuração de ferramentas externas no Eclipse.

insira a descrição da imagem aqui

Aneesh Vijendran
fonte
2

Você também pode ir para a pasta bin dentro da pasta de instalação gradle e corrigir o parâmetro JAVA_HOME no arquivo gradle.bat. No meu caso, meu JAVA_HOME foi definido como c: \ Arquivos de programas \ java \ bin O JAVA_HOME no gradle.bat foi definido como% JAVA_HOME% \ bin \ java.exe.

Corrigi o JAVA_HOME no gradle.bat e funcionou.

Obrigado!!!

asp_NewBee
fonte
agora é 2019 e isso ainda é um problema! Exceto que é um pouco diferente e a variável com falha agora está "configurada JAVA_EXE =% JAVA_HOME% / bin / java.exe" - remova a parte da lixeira daqui para corrigir.
Andy Lorenz
2
sudo ln -s /usr/lib/jvm/java-7-oracle/jre /usr/lib/jvm/default-java

Crie um link simbólico para o diretório java padrão.

Você pode encontrar seu diretório java

readlink -f $(which java) 
# outputs: /usr/lib/jvm/java-7-oracle/jre/bin/java
# Remove the last `/bin/java` and use it in above symbolic link command.
Venkat Kotra
fonte
Essa resposta seria melhorada se você explicasse o que esse comando faz e por que é necessário.
Ian McLaird
2

Antes de executar o comando, tente digitar:

export JAVA_HOME="path_to_java_home"

Onde path_to_java_homeestá a pasta onde bin/javaestá.

Se o java estiver instalado corretamente, você poderá encontrar sua localização usando o comando:

readlink -f $(which java)

Não se esqueça de remover bin/javado final do caminho enquanto o colocaJAVA_HOME

Jasper Kinoti
fonte
1

Eu também tive um problema com isso. Dizia que o diretório estava errado quando estava correto. Acabei de criar uma variável local com o nome JAVA_HOME omitindo o final / bin / java. Funcionou bem para mim.

Bedrockbreaker
fonte
1

Se seu ambiente GRADLE_HOME e JAVA_HOME estiver definido corretamente, verifique seu diretório JDK e verifique se o arquivo java.exe está no caminho abaixo.

C:\Program Files (x86)\Java\jdk1.8.0_181\bin

Como erro mencionado no arquivo gradle.bat

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

Não é possível localizar a instalação do java. Então encontre e defina

java.exe

abaixo %JAVA_HOME%/binse tudo estiver correto.

Isso funciona para mim (minha conta foi desativada pelo cliente e o administrador deles removeu o java.exe do meu diretório.)

Harsh
fonte
0

No meu dockercontainer (sendo mínimo o problema de não encontrar o java), o "qual" não estava instalado. A compilação de um projeto usando gradlew usou o qual em ./gradlew para encontrar a instalação java que resolveu o problema.

lem-fr
fonte
0

[Windows] Como já foi dito, parece que o .bat -file tenta encontrar o java.exe %JAVA_HOME%/bin/java.exee não o encontra, pois biné repetido duas vezes no caminho. Remova esse extra /bindo gradle.bat.

Gradle

O-9
fonte
0

A adição de linhas abaixo no build.gradle resolveu meu problema.

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Sameera De Silva
fonte