La etiqueta languageLevel de Android .idea / misc.xml sigue cambiando los JDK

178

La clave languageLevel se cambia de JDK_1_8 a JDK_1_7 por razones que no conozco.

¿Qué podría estar pasando?

¿Tiene esto algo que ver con el IDE de otros desarrolladores que trabajan en el proyecto? ¿Quizás tienen otra configuración de Android Studio?

Esto es lo que aparece después de notar que los archivos bajo control de origen han cambiado:

$ git diff
diff --git a/.idea/misc.xml b/.idea/misc.xml
index fbb6828..5d19981 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -37,7 +37,7 @@
     <ConfirmationsSetting value="0" id="Add" />
     <ConfirmationsSetting value="0" id="Remove" />
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   <component name="ProjectType">

Este es mi gitignore en caso de que importe.

.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures

¿Cómo procedo para que se quede de una forma u otra?

kraftydevil
fuente
1
Yo hice. Respuesta agregada.
kraftydevil
44
Solo quiero señalar que intellij-support.jetbrains.com/hc/en-us/articles/… es la respuesta oficial a lo que debería estar .gitignore, y esta solución alternativa va en contra de esto. Pierde la capacidad de compartir las propiedades del proyecto con todos los desarrolladores, como las configuraciones de inspecciones / pelusas que utilizamos para evitar algunas malas prácticas estándar antes incluso de revisar el código. Simplemente puede agregar /.idea/misc.xmlal .gitignorearchivo para resolver esto.
Matt Quigley
44
Me di cuenta de este problema y ni siquiera fue después de que un miembro del equipo diferente se comprometió a trabajar. Hice mi propio trabajo, presioné un commit, hice un poco más de trabajo y noté que me había vuelto a encender. Eso es lo que más me preocupa. Si es un miembro diferente del equipo, entonces sé por qué está cambiando, pero cambiar al azar durante el desarrollo local personal es preocupante y confuso. ¿Alguna idea de esto?
John Shelley
3
Tengo el mismo problema, el nivel de idioma cambia constantemente entre 1.7 y 1.8.
Han He
1
tema relacionado con stackoverflow.com/questions/17637179/…
CrandellWS

Respuestas:

42

Esto me estaba volviendo loco por un tiempo. Pude solucionarlo configurando explícitamente la versión de Java en mi build.gradle:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

Tenga en cuenta que si está usando VERSION_1_7, cuando inicia Android Studio en frío o cambia a otro proyecto que usa VERSION_1_8, se modificará .idea/misc.xmlpara usar JDK_1_8. Hacer una sincronización de Gradle lo volverá a usar JDK_1_7. Si está utilizando VERSION_1_8, no tendrá este problema.

No es perfecto, pero encontré que esto es lo suficientemente bueno por ahora.

Navidad
fuente
2
Actualmente, no use ni quiera usar el JDK incrustado como se sugiere en stackoverflow.com/a/40083824/1815624, usando la opción gradle evita el problema cambiante. Puede que desee tener esto en cuenta code.google.com/p/android/issues/detail?id=172115
CrandellWS
¿Debo poner esto en el proyecto o en el archivo del módulo?
rraallvv
@rraallvv el módulo
Noel
Este tipo de "arregla" para mí. Tengo esas opciones en mi archivo gradle. Si abro studio (hace una sincronización de gradle y), establece misc.xml en 1_8. Si construyo entonces, se restablecerá a 1_7. Si luego sincronizo gradle, se volverá a establecer en 1_8 y la construcción ya no lo volverá a establecer en 1_7. Hacer la sincronización de Gradle nunca lo establece en 1_7 para mí, siempre es 1_8 después de una sincronización de Gradle. Cada vez que abro el estudio, se establece en 1_8.
David
Si desea utilizar JDK 1.8: android {compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}}
Beatrice Lin
24

Vine aquí de Google después de actualizar a Android Studio 2.2. Esto podría ser útil para otros.

Desde Android Studio 2.2, el JDK se ha incluido con él, en lugar de tener que descargarlo e instalarlo en su sistema. Mi proyecto JDK comenzó a cambiar cuando actualicé a 2.2, posiblemente debido a la confusión entre las dos versiones disponibles ahora: sistema e integrado.

Si va a Archivo> Estructura del proyecto (Mac OS), en la pestaña Ubicación del SDK, hay una ubicación JDK. Ahora hay una nueva configuración para usar el JDK incorporado. Una vez que lo cambié, resolvió mi problema.

ingrese la descripción de la imagen aquí

ROJO_
fuente
77
Hice esto (aunque en Win10) pero tan pronto como reinicié AS noté que el problema continúa :(
CesarPim
2
Esto funciona para resolver el problema. Como @CesarPim menciona, veo que reaparece cuando la compilación no está sincronizada. Al ejecutar la sincronización de Gradle, se borra el cambio. En general, es una buena solución limpia, mucho mejor que antes, ¡gracias!
Gene Bo
55
¿Qué quieres decir @gnB? Conmigo sigue yendo y viniendo entre 1.7 y 1.8 ... no pude encontrar una solución estable. ¿Eras tú?
CesarPim
3
@gnB sí, lo mismo conmigo, pero todavía me molesta que suceda cada vez que
ejecuto
15
Todavía sucede en Android Studio 3.0, y esta sugerencia no lo solucionó. Ya he seleccionado "JDK incrustado", y aún así sigue cambiando de 1_7 a 1_8 y viceversa sin razón aparente.
Greg Ennis
9

Parece que el archivo debe almacenarse bajo control de versiones . Propondría mantenerlo en git, pero ignore todos los cambios locales:

git update-index --assume-unchanged .idea/misc.xml

Al cambiar de rama puede haber conflicto en estos archivos. Luego, podría usar el siguiente script imlreset para restablecer los archivos:

#!/bin/bash                                                                     
while read f                                                                    
do                                                                              
  [ -f $f ] && git checkout $f                                                    
done <<!                                                                        
app/app.iml                                                           
wear/wear.iml                                                                   
!

Cree un script similar para ignorar estos archivos si lo hace con frecuencia.

Paweł Nadolski
fuente
Esto no evita problemas al cambiar de sucursal, si el IDE cambia el archivo, los cambios deben eliminarse de alguna manera antes de que pueda pagar una sucursal diferente.
ergosys
@ergosys, gracias por comentar. Se agregó un script que uso en tales casos.
Paweł Nadolski
1
Ignorar el archivo es una solución anti, y ni siquiera una solución beneficiosa. No remedia la causa, oculta los síntomas y, al hacerlo, crea y oculta problemas simples para que sean difíciles de encontrar y solucionar.
Barry Staes
@BarryStaes, gracias por sus comentarios. No encontré la solución perfecta para este problema (otras soluciones no funcionaron) y esta funciona para mí y para otras personas. Tenga en cuenta que esto no ignora por completo los archivos, solo oculta el hecho de que han cambiado. Dado que estos archivos pueden cambiar a menudo y al azar, permite filtrarlos al hacer comandos git. Todavía puedes cometerlos cuando quieras.
Paweł Nadolski,
1

Resolví este problema cuando eliminé y dejé de asignar la carpeta .idea al control de origen.

El problema es que algunos de estos archivos son configuraciones específicas de la máquina, por lo que compartirlos podría ser un problema.

Eliminarlo y otros archivos ofensivos fue un proceso git de dos pasos:

1) Agregue este .gitignore (de https://stackoverflow.com/a/32942758/869936 ):

#built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties

# Windows thumbnail db
Thumbs.db

# OSX files
.DS_Store

# Eclipse project files
.classpath
.project

# Android Studio
*.iws
*.iml
.idea
.gradle
build/
*/build/

2) Para cada línea de .gitignore, ejecute git rm linedesde la línea de comando.

Ejemplo:

$ git rm *.iws
$ git rm *.iml
$ git rm .idea
$ git rm .gradle
$ git rm build/
$ git rm */build/

Agregar y confirmar los cambios

Ahora estos archivos se generarán cuando abra el proyecto de Android Studio y no se agregarán a git.

kraftydevil
fuente
20
De acuerdo con intellij-support.jetbrains.com/hc/en-us/articles/… se supone que debe comprometer la mayor parte de la .ideacarpeta porque no son específicos de la máquina, excepto para workspace.xmly tasks.xml. Dicho esto, no está muy bien pensado en términos de control de versiones, debido a problemas como estos. Me imagino que eventualmente resolverán el desastre.
Matt Quigley el
Entiendo que hay discrepancias. Al mismo tiempo, no estoy al tanto de ningún problema en mi equipo de desarrollo al usar este .gitignore. Si supiera más, podría aconsejar más, pero esto es lo que nos está funcionando en este momento. Si se presenta un problema, cambiaré mi respuesta.
kraftydevil
31
Sí, todos sabemos cómo forzar a git a ignorar este archivo. Pero la verdadera pregunta es por qué sigue cambiando de JDK_1_8 a JDK_1_7 (y, a veces, de nuevo).
Scott Biggs
Comenzó a sucederme con Android Studio 2.2. Creo que agruparon el JDK comenzando con AS 2.2, por lo que es posible que siga confundiéndose entre el sistema y el que está dentro de AS.
RED_
3
Esto no responde a la pregunta en absoluto. Lo cual es extraño porque lo preguntaste. Así es como ignorar el problema, lo que podría estar bien para usted, supongo, me gustaría saber por qué sigue cambiando y cómo evitar que lo haga.
David