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)

James Barnett
fuente
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.

James Barnett
fuente
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
Shashi
fuente
@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)  )))
Scott Stensland
fuente
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
Jyoti Prakash
fuente
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.

Mohammed Safeer
fuente
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
Lucas
fuente
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.

Agilox
fuente
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.

nada especial
fuente
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

MJ Montes
fuente
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í

Aneesh Vijendran
fuente
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!!!

asp_NewBee
fuente
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.
Venkat Kotra
fuente
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

Jasper Kinoti
fuente
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í.

Rompecamas
fuente
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).

Duro
fuente
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.

lem-fr
fuente
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

O-9
fuente
0

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

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