Gradle trova JAVA_HOME errato anche se è impostato correttamente


168

Quando provo a eseguire Gradle, ottengo il seguente errore:

# 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.

Tuttavia, quando controllo la variabile JAVA_HOME ottengo:

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

Il mio JAVA_HOME è definito in .bashrc e ho ricontrollato che sia impostato come sorgente.

L'esecuzione java -versionconferma anche che JAVA_HOME è impostato correttamente e si trova sul PERCORSO.

# 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)

Ho anche controllato i /usr/bin/javacollegamenti simbolici a /etc/alternatives/javacui a loro volta si collegano correttamente i collegamenti simbolici/usr/lib/jvm/java-7-oracle/jre/bin/java

Inoltre ho verificato che non ci siano definizioni JAVA_HOME duplicate in .bash_profileo /etc/profile.

Quindi la mia domanda è come / perché trova Gradle /usr/lib/jvm/default-javae, soprattutto, come posso indicarlo nella directory corretta?

Altri programmi che richiedono il JDK funzionano bene, quindi penso che sia un problema Gradle. Ho anche provato a reinstallare Gradle che non ha fatto differenza.

Sto eseguendo Xubuntu a 64 bit (base Ubuntu 13.10)


Fornisci l'output completo dell'errore. Allo stato attuale, non è chiaro da dove provenga il messaggio. Inoltre, hai una /usr/lib/jvm/default-javadirectory o un link simbolico? E come hai installato Gradle?
Peter Niederwieser,

Ho aggiornato la Q, ma praticamente è l'output dell'errore completo. Non c'è /usr/lib/jvm/default-javadir. Installato con apt (apt-get install gradle)
James Barnett

Non è necessario JAVA_HOMEimpostare lo script di avvio Gradle . Se JAVA_HOMEimpostato, lo script utilizza $JAVA_HOME/bin/javaper eseguire Gradle. Altrimenti, usa java(cioè javadeve essere sul PATH). Forse il pacchetto apt (di terze parti) utilizza uno script iniziale modificato.
Peter Niederwieser,

Sì, sembra che qualunque ppa da cui ho preso il binario sia stato codificato ed esportato in JAVA_HOME usr/lib/jvm/defult-java. Grazie per l'aiuto
James Barnett,

Hai fatto source ~/.bashrco riavviato il computer dopo aver impostato JAVA_HOME?
IgorGanapolsky,

Risposte:


263

Si scopre che il particolare binario Gradle che ho scaricato dal repository Ubuntu 13.10 stesso tenta di esportare JAVA_HOME. Grazie a Lucas per avermi suggerito questo.

/usr/bin/gradle linea 70:

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

Commentare questa riga risolve il problema e Gradle trova il percorso corretto per il binario Java.

Se scarichi semplicemente il file binario dal loro sito Web , questo non ha questo problema, è un problema con la versione repository di Ubuntu. Sembra che ci siano anche altri problemi con la versione 13.10.


Il pacchetto gradle sembra installare il jdk in questa posizione, almeno su Ubuntu 12.04 LTS con solo i repository predefiniti. L'ho fatto su una macchina virtuale Ubuntu che non aveva Java, l'ho prima fatto un'istantanea, apt-get install gradle (che installa quasi 400 pacchetti) e ha installato java su / usr / lib / jvm ... snapshot ripristinato, no / usr / lib / JVM. Stavo testando la teoria dell'esportazione di script Gradle JAVA_HOME e in effetti lo fa, come hai scoperto.
Joshua McKinnon,

2
Gradle non lo fa. Il ppa è fornito da qualcun altro, quindi dovresti chiederglielo. In generale, consiglierei di bootstrap Gradle tramite Gradle Wrapper, piuttosto che installarlo tramite un gestore di pacchetti.
Peter Niederwieser,

Ho aggiornato la risposta per chiarire che la versione repository di Ubuntu è il problema, non Gradle stesso.
James Barnett,

11
Grazie, cerco da più di un'ora una soluzione a questo problema. Grazie per questo post, risolve il mio problema su Ubuntu 14.04
Kay Schneider,

1
Modo di risolvere il tuo problema (e il mio contemporaneamente)! È un peccato che questa domanda abbia un anno e che lo script Gradle nel repository non sia stato aggiornato per risolvere questo problema.
Sotrh,

49

aggiungere un collegamento simbolico

sudo ln -s /usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java

@Nar potresti per favore fornire il percorso di installazione di JAVA
Shashi

Grazie per la risposta, ma il percorso di JAVA non ha importanza perché lo script gradle ignora il percorso come detto James stackoverflow.com/a/22309017/1679348
Nar

5
Ha funzionato bene per me. Dato il nome ( default-java ), direi che questo è un approccio abbastanza sensato.
Phil

2
Secondo me questa è una soluzione molto migliore rispetto alla modifica dei file Gradle. (E sì, funziona perfettamente per me)
zorglub76

Grazie Signore! Mi hai risparmiato tempo!
AlexKh

21

La soluzione è rendere JAVA_HOME == dir sopra il bin in cui javac vive come in

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, quindi finalmente ho trovato il cestino sopra il javac reale, quindi fallo

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

sopra può essere semplificato e generalizzato a

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)  )))

13

Per me questo errore era dovuto al motivo Gradle installato come sudo e stavo provando come utente predefinito per eseguire Gradle.

Provare:

sudo gradle -version

o

sudo gradle -v

7

Prova a installare l'ultima versione di gradle,

sudo add-apt-repository ppa:cwchien/gradle

sudo apt-get update

sudo apt-get install gradle

Se installiamo dal repository di Ubuntu, installerà la vecchia versione (per me era il grado 1.4). Nella versione precedente, imposta java home dal livello come export JAVA_HOME=/usr/lib/jvm/default-java. L'ultima versione non presenta questo problema.


5

Sei stato exporttuo JAVA_HOME? Senza esportazione, l'impostazione non verrà propagata ai comandi avviati all'interno di quella shell. Inoltre, java -versionnon utilizza JAVA_HOME, piuttosto utilizza il primo javatrovato nel tuo percorso. Assicurati che il tuo .bashrcaspetto sia simile al seguente:

JAVA_HOME=/path/to/java/home
export JAVA_HOME

1
Sì, è definito in .bashrc come export JAVA_HOME=/usr/lib/jvm/java-7-oracle(sintassi leggermente diversa ma presumo sia la stessa)
James Barnett

3
@JamesBarnett, il gradlecomando stesso potrebbe impostare quella variabile? Forse la persona che ha installato ha gradlecreato uno script wrapper che imposta le variabili di ambiente prima di avviare l'applicazione. Quando si utilizza Tomcat, non è insolito catalina.shche (che è lo script di avvio) venga chiamato a setenv.shper impostare le variabili di ambiente che possono includereJAVA_HOME
Lucas

4

Ho riscontrato questo problema quando ho eseguito il seguente comando su Ubuntu:

ionic build android

Per risolvere questo problema, ho fatto i seguenti passi:

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

Aggiungi JAVA_HOME a / etc / environment:

vi /etc/environment

Inserisci:

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

Dopo aver salvato, leggilo:

source /etc/environment

Infine, puoi eseguire il comando build.


4

Ho avuto lo stesso problema, ma non ho trovato il comando export nella riga 70 nel file gradle per l'ultima versione 2.13, ma ho capito un errore sciocco lì, che sta seguendo,

Se non trovi la riga 70 con il comando export nel file gradle nella tua cartella gradle / bin /, controlla il tuo ~ / .bashrc, se lo trovi export JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64/bin/java, quindi rimuovi /bin/javada questa riga, come JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64, e nel percorso >>> invece di questo export PATH=$PATH:$HOME/bin:JAVA_HOME/, lo sarà export PATH=$PATH:$HOME/bin:JAVA_HOME/bin/java. Quindi corri source ~/.bashrc.

Il motivo è che se controlli il tuo file gradle, lo troverai nella riga 70 (se non c'è un comando di esportazione) o nella riga 75,

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

Ciò significa che /bin/javaè già lì, quindi deve essere sottratto dal JAVA_HOMEpercorso.

È successo nel mio caso.


4

Nel mio Ubuntu, ho un mal di testa per 2 giorni su questo problema.

Passaggio 1. Digitare sul terminale whereis java quindi verrà visualizzato qualcosa del genere

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

Passaggio 2. Prendere nota del percorso: /usr/lib/jvm/java-8-openjdk-amd64/bin/java

escludi il bin/java

il tuo JAVA_HOME = /usr/lib/jvm/java-8-openjdk-amd64


La chiave qui è di escludere / bin / java
Borjante l'

2

Per me il problema era un set esplicito nella sezione argomenti della configurazione degli strumenti esterni in Eclipse.

inserisci qui la descrizione dell'immagine


2

Puoi anche andare alla cartella bin all'interno della cartella di installazione di gradle e correggere il parametro JAVA_HOME nel file gradle.bat. Nel mio caso, il mio JAVA_HOME era impostato su c: \ Programmi \ java \ bin Il JAVA_HOME in gradle.bat era impostato su% JAVA_HOME% \ bin \ java.exe.

Ho corretto JAVA_HOME in gradle.bat e ha funzionato.

Grazie!!!


è ora il 2019 e questo è ANCORA un problema! Tranne che è leggermente diverso e la variabile in errore è ora "set JAVA_EXE =% JAVA_HOME% / bin / java.exe" - rimuovere la parte del cestino da qui per risolvere.
Andy Lorenz,

2
sudo ln -s /usr/lib/jvm/java-7-oracle/jre /usr/lib/jvm/default-java

Creare un collegamento simbolico alla directory default-java.

Puoi trovare la tua directory java da

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.

Questa risposta sarebbe migliorata se spiegassi cosa fa questo comando e perché è necessario.
Ian McLaird,

2

Prima di eseguire il comando provare a inserire:

export JAVA_HOME="path_to_java_home"

Dov'è path_to_java_homela cartella in cui il tuobin/java trovi.

Se java è installato correttamente puoi trovarne la posizione, usando il comando:

readlink -f $(which java)

Non dimenticare di rimuovere bin/javadalla fine del percorso mentre lo inserisciJAVA_HOME


1

Ho avuto un problema anche con questo. Diceva directory sbagliata quando era corretta. Quindi ho appena creato una variabile locale con il nome di JAVA_HOME omettendo il / bin / java finale. Ha funzionato bene per me.


1

Se l'ambiente GRADLE_HOME e JAVA_HOME sono impostati correttamente, controlla la directory JDK e assicurati di avere il file java.exe nel percorso seguente.

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

Come errore menzionato nel file 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.

Non è in grado di individuare l'installazione di Java. Quindi trova e imposta

java.exe

sotto %JAVA_HOME%/binse tutto è corretto.

Questo funziona per me (il mio account è stato disabilitato dal client e il loro amministratore ha rimosso java.exe dalla mia directory.)


0

Nel mio dockercontainer (essendo minimo il problema di non trovare java) c'era quello "che" non era installato. Combinazione di un progetto usando gradlew usato che in ./gradlew per trovare java Installazione che ha risolto il problema.


0

[Windows] Come già detto, sembra che .bat -file tenti di trovare java.exe, %JAVA_HOME%/bin/java.exequindi non lo trova poiché binviene ripetuto due volte nel percorso. Rimuovi quel extra /binda gradle.bat.

Gradle


0

L'aggiunta delle righe seguenti in build.gradle ha risolto il mio problema.

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.