Gradle encuentra JAVA_HOME incorrecto aunque esté configurado correctamente


168

Cuando intento ejecutar gradle, aparece el siguiente error:

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

Sin embargo, cuando verifico la variable JAVA_HOME obtengo:

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

Mi JAVA_HOME está definido en .bashrc y he verificado que está configurado como la fuente.

La ejecución java -versiontambién confirma que JAVA_HOME está configurado correctamente y está en la RUTA.

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

También he comprobado los /usr/bin/javaenlaces simbólicos a los /etc/alternatives/javaque a su vez los enlaces simbólicos correctamente/usr/lib/jvm/java-7-oracle/jre/bin/java

Además, he comprobado que no hay definiciones JAVA_HOME duplicadas en .bash_profileo /etc/profile.

Entonces, mi pregunta es cómo / por qué encuentra Gradle /usr/lib/jvm/default-java, y lo más importante, ¿ cómo lo apunto al directorio correcto?

Otros programas que requieren el JDK funcionan bien, así que creo que es un problema de Gradle. También intenté reinstalar Gradle, lo que no hizo ninguna diferencia.

Estoy ejecutando Xubuntu de 64 bits (Ubuntu 13.10 base)


Proporcione la salida de error completa. Tal como está, no está claro de dónde viene el mensaje. Además, ¿tiene un /usr/lib/jvm/default-javadirectorio o enlace simbólico? ¿Y cómo instalaste Gradle?
Peter Niederwieser

He actualizado la Q, pero esa es la salida de error completa. No hay /usr/lib/jvm/default-javadir. Instalado con apt (apt-get install gradle)
James Barnett

El script de inicio de Gradle no necesita JAVA_HOMEser configurado. Si JAVA_HOMEestá configurado, el script se usa $JAVA_HOME/bin/javapara ejecutar Gradle. De lo contrario, utiliza java(es decir, javatiene que estar en el PATH). Quizás el paquete apt (de terceros) usa un script de inicio modificado.
Peter Niederwieser

Sí, parece que cualquier ppa del que obtuve el binario había codificado y exportado el JAVA_HOME usr/lib/jvm/defult-java. Gracias por la ayuda
James Barnett

¿Lo hizo source ~/.bashrco reinició su máquina después de configurar JAVA_HOME?
IgorGanapolsky

Respuestas:


263

Resulta que el binario particular, Gradle he descargado desde el Ubuntu 13.10 repositorio en sí intenta export JAVA_HOME. Gracias a Lucas por sugerir esto.

/usr/bin/gradle línea 70:

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

Comentar esta línea resuelve el problema y Gradle encuentra la ruta correcta al binario de Java.

Si solo descarga el binario desde su sitio web , no tiene este problema, es un problema con la versión de repositorio de Ubuntu. También parece haber otros problemas con la versión 13.10.


El paquete gradle parece instalar el jdk en esta ubicación, al menos en Ubuntu 12.04 LTS con solo los repositorios predeterminados. Hice esto en una máquina virtual Ubuntu que no tenía Java, primero lo capturé, apt-get install gradle (que instala casi 400 paquetes), e instaló java en / usr / lib / jvm ... instantánea revertida, no / usr / lib / jvm. Estaba probando la teoría del gradle script exportando JAVA_HOME y de hecho lo hace, como descubriste.
Joshua McKinnon

2
Gradle no hace esto. El ppa es proporcionado por otra persona, por lo que tendría que preguntarles. En general, recomendaría arrancar Gradle a través del Gradle Wrapper, en lugar de instalarlo a través de un administrador de paquetes.
Peter Niederwieser

Actualicé la respuesta para aclarar que la versión de repositorio de Ubuntu es el problema, no Gradle en sí.
James Barnett

11
Gracias, busco más de una hora para encontrar una solución a este problema. Gracias por esta publicación, resuelve mi problema en ubuntu 14.04
Kay Schneider

1
¡Manera de resolver su propio problema (y el mío simultáneamente)! Es una pena que esta pregunta tenga un año y que el script de Gradle en el repositorio no se haya actualizado para solucionarlo.
sotrh

49

agregar un enlace simbólico

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

@Nar, ¿podría proporcionar la ruta de instalación de JAVA
Shashi

Gracias por la respuesta, pero la ruta de JAVA no importa porque la secuencia de comandos de Gradle anula la ruta como dijo James stackoverflow.com/a/22309017/1679348
Nar

55
Funcionó muy bien para mí. Dado el nombre ( default-java ), diría que este es un enfoque bastante sensato.
Phil

2
En mi opinión, esta es una solución mucho mejor que cambiar los archivos de Gradle. (Y sí, funciona bien para mí)
zorglub76

¡Gracias Señor! ¡Me salvaste el tiempo!
AlexKh

21

La solución es hacer JAVA_HOME == dir encima de bin donde javac vive como en

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, así que finalmente encontré el contenedor encima de javac real, así que haz esto

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

anterior se puede simplificar y generalizar 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

Para mí, este error se debió a la razón por la cual Gradle se instaló como sudo y estaba intentando, como usuario predeterminado, ejecutar Gradle.

Tratar:

sudo gradle -version

o

sudo gradle -v

7

Intenta instalar la última versión de gradle,

sudo add-apt-repository ppa:cwchien/gradle

sudo apt-get update

sudo apt-get install gradle

Si lo instalamos desde ubuntu repo, instalará la versión anterior (para mí fue gradle 1.4). En la versión anterior, establece java home desde gradle como export JAVA_HOME=/usr/lib/jvm/default-java. La última versión no tiene este problema.


5

¿ exportTu tu JAVA_HOME? Sin exportación, la configuración no se propagará a los comandos iniciados dentro de ese shell. Además, java -versionno usa JAVA_HOME, sino que usa el primero javaencontrado en su ruta. Asegúrate de que tu .bashrcaspecto sea así:

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

1
Sí, se define en .bashrc como export JAVA_HOME=/usr/lib/jvm/java-7-oracle(sintaxis ligeramente diferente pero supongo que es la misma)
James Barnett

3
@JamesBarnett, ¿podría el gradlecomando en sí mismo establecer esa variable? Quizás la persona que instaló gradlecreó una secuencia de comandos de contenedor que establece las variables de entorno antes de iniciar la aplicación. Cuando se usa tomcat, no es raro catalina.shque (que es el script de inicio) llame a un setenv.shpara configurar variables de entorno que pueden incluirJAVA_HOME
Lucas

4

Enfrenté este problema cuando ejecuté el siguiente comando en Ubuntu:

ionic build android

Para resolver este problema, hice los siguientes pasos:

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

Agregue JAVA_HOME a / etc / environment:

vi /etc/environment

Añadir:

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

Después de guardar, léalo:

source /etc/environment

Finalmente, puede ejecutar el comando de compilación.


4

Tuve el mismo problema, pero no encontré el comando de exportación en la línea 70 en el archivo gradle para la última versión 2.13, pero entiendo un error tonto allí, que es el siguiente,

Si no encuentra la línea 70 con el comando de exportación en el archivo gradle en su carpeta / bin / gradle, compruebe su ~ / .bashrc, si lo encuentra export JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64/bin/java, elimínelo /bin/javade esta línea, como JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64, y en su lugar en la ruta >>> de esto export PATH=$PATH:$HOME/bin:JAVA_HOME/, lo será export PATH=$PATH:$HOME/bin:JAVA_HOME/bin/java. Entonces corre source ~/.bashrc.

La razón es que si revisa su archivo gradle, encontrará en la línea 70 (si no hay un comando de exportación) o en la línea 75,

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

Eso significa /bin/javaque ya está allí, por lo que debe sustraerse de la JAVA_HOMEruta.

Eso sucedió en mi caso.


4

En mi Ubuntu, me duele la cabeza durante 2 días por este problema.

Paso 1. Escribe en el terminal y whereis java luego mostrará algo como esto

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

Paso 2. Tome nota de la ruta: /usr/lib/jvm/java-8-openjdk-amd64/bin/java

excluir el bin/java

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


La clave aquí es excluir / bin / java
Borjante

2

Para mí, el problema era un conjunto explícito en la sección de argumentos de la configuración de herramientas externas en Eclipse.

ingrese la descripción de la imagen aquí


2

También puede ir a la carpeta bin dentro de su carpeta de instalación de gradle y corregir el parámetro JAVA_HOME en el archivo gradle.bat. En mi caso, mi JAVA_HOME se configuró en c: \ Archivos de programa \ java \ bin El JAVA_HOME en gradle.bat se configuró en% JAVA_HOME% \ bin \ java.exe.

Corregí el JAVA_HOME en gradle.bat y funcionó.

¡¡¡Gracias!!!


ahora es 2019 y ¡TODAVÍA es un problema! Excepto que es un poco diferente y la variable culpable ahora es "set JAVA_EXE =% JAVA_HOME% / bin / java.exe" - elimine la parte bin de aquí para corregirla.
Andy Lorenz

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

Cree un enlace simbólico al directorio predeterminado-java.

Puede encontrar su directorio java por

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.

Esta respuesta mejoraría si explicara qué hace este comando y por qué es necesario.
Ian McLaird

2

Antes de ejecutar el comando, intente ingresar:

export JAVA_HOME="path_to_java_home"

¿Dónde path_to_java_homeestá la carpeta donde está tubin/java está?

Si Java está instalado correctamente, puede encontrar su ubicación, utilizando el comando:

readlink -f $(which java)

No olvides quitarlo bin/javadel final del camino mientras lo colocas enJAVA_HOME


1

También tuve un problema con esto. Dijo directorio incorrecto cuando era correcto. Así que acabo de crear una variable local con el nombre de JAVA_HOME omitiendo el final / bin / java. Funcionó bien para mí.


1

Si su entorno GRADLE_HOME y JAVA_HOME están configurados correctamente, verifique su directorio JDK y asegúrese de tener el archivo java.exe debajo de la ruta de acceso.

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

Como error mencionado en el archivo 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.

No puede localizar su instalación de Java. Así que encuentra y establece

java.exe

debajo %JAVA_HOME%/binsi todo es correcto.

Esto funciona para mí (mi cuenta fue deshabilitada por el cliente y su administrador ha eliminado java.exe de mi directorio).


0

En mi dockercontainer (siendo mínimo el problema de no encontrar Java) era, eso "que" no estaba instalado. Al compilar un proyecto usando gradlew, utilicé cuál en ./gradlew para encontrar la instalación de Java que resolvió el problema.


0

[Windows] Como ya se dijo, parece que .bat -file intenta encontrar java.exe, por %JAVA_HOME%/bin/java.exelo que no lo encuentra, ya que binse repite dos veces en la ruta. Elimina ese extra /binde gradle.bat.

Gradle


0

Agregar líneas debajo en build.gradle resolvió mi problema.

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.