A tag languageLevel do Android .idea / misc.xml continua alterando os JDKs

178

A chave languageLevel é alterada de JDK_1_8 para JDK_1_7 por motivos que não conheço.

O que poderia estar acontecendo?

Isso tem algo a ver com o IDE de outros desenvolvedores que trabalham no projeto? Talvez eles tenham outra configuração do Android Studio?

Aqui está o que aparece depois que eu aviso que os arquivos sob controle de origem foram alterados:

$ 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 é o meu gitignore, caso isso importe.

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

Como procedo para que fique apenas de um jeito ou de outro?

kraftydevil
fonte
1
Eu fiz. Resposta adicionada.
Kraftydevil
4
Eu só quero salientar que intellij-support.jetbrains.com/hc/en-us/articles/… é a resposta oficial para o que deve estar dentro .gitignore, e essa solução alternativa vai contra isso. Você perde alguma capacidade de compartilhar propriedades do projeto para todos os desenvolvedores, como configurações de inspeções / fiapos que usamos para evitar algumas práticas inadequadas antes de começar a revisão de código. Você pode simplesmente adicionar /.idea/misc.xmlao .gitignorearquivo para resolver isso.
Matt Quigley
4
Eu mesmo notei esse problema e não foi mesmo depois que outro membro da equipe comprometeu o trabalho. Fiz meu próprio trabalho, enviei um commit, fiz mais um trabalho e notei que ele havia me ligado novamente. É isso que me preocupa mais. Se é um membro diferente da equipe, sei por que está mudando, mas mudar aleatoriamente durante o desenvolvimento local pessoal é preocupante e confuso. Alguma idéia disso?
John Shelley
3
Eu tenho o mesmo problema, o nível do idioma continua mudando entre 1,7 e 1,8.
Han He
1
tópico relacionado a stackoverflow.com/questions/17637179/…
CrandellWS

Respostas:

42

Isso estava me deixando louco por um tempo. Consegui corrigi-lo definindo explicitamente a versão java no meu build.gradle:

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

Observe que, se você estiver usando VERSION_1_7, quando iniciar o Android Studio a frio ou alternar para outro projeto que use VERSION_1_8, ele será modificado .idea/misc.xmlpara uso JDK_1_8. A sincronização gradual irá reverter novamente para o uso JDK_1_7. Se você estiver usando VERSION_1_8, não terá esse problema.

Não é perfeito, mas achei que isso é bom o suficiente por enquanto.

Noel
fonte
2
Atualmente, não use nem deseje usar o JDK de incorporação, conforme sugerido em stackoverflow.com/a/40083824/1815624, usando a opção gradle impede a alteração do problema. Talvez seja necessário observar isso. Code.google.com/p/android/issues/detail?id=172115
CrandellWS
Devo colocar isso no projeto ou no arquivo do módulo?
precisa saber é o seguinte
@rraallvv the module
Noel
Esse tipo de "corrige" isso para mim. Eu tenho essas opções no meu arquivo gradle. Se eu abrir o studio (ele faz uma sincronização gradle e), ele define misc.xml como 1_8. Se eu construir, ele será definido como 1_7. Se eu sincronizar o gradle, ele voltará a 1_8 e o edifício não o voltará a 1_7. Fazendo sincronização gradle nunca a define 1_7 para mim, é sempre 1_8 após uma sincronização gradle. Sempre que abro o estúdio, ele é definido como 1_8.
David
Se você deseja usar o JDK 1.8: android {compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}}
Beatrice Lin
24

Veio aqui do Google após atualizar para o Android Studio 2.2. Isso pode ser útil para outras pessoas.

Desde o Android Studio 2.2, o JDK foi fornecido com ele, em vez de você precisar fazer o download e instalá-lo no seu sistema. Meu projeto JDK começou a mudar quando eu atualizei para o 2.2, possivelmente por causa da confusão entre as duas versões disponíveis agora - sistema e incorporado.

Se você for para Arquivo> Estrutura do projeto (Mac OS), na guia Localização do SDK, haverá a localização do JDK. Agora há uma nova configuração para usar o JDK incorporado. Depois que mudei para ele, o problema foi resolvido.

insira a descrição da imagem aqui

VERMELHO_
fonte
7
Eu fiz isso (embora em Win10), mas assim que eu reiniciei como eu notei o problema persistir :(
CesarPim
2
Isso funciona para resolver o problema. Como o @CesarPim menciona, vejo que ele reaparece quando a compilação está fora de sincronia. A execução da sincronização gradle limpa a alteração. No geral, uma boa solução limpa, muito melhor do que era antes - obrigado!
Gene Bo
5
Como assim @gnB? Comigo, ele continua indo e voltando entre 1,7 e 1,8 ... não consegui encontrar uma solução estável. Você estava?
CesarPim
3
@gnB sim, o mesmo comigo, mas ainda me incomoda que isso acontece cada vez que eu lançar AS ... isso não deve acontecer
CesarPim
15
Ainda está acontecendo no Android Studio 3.0, e essa sugestão não foi corrigida. Eu já selecionei o "JDK incorporado" e, mesmo assim, continua mudando de 1_7 para 1_8 e vice-versa sem motivo aparente.
Greg Ennis
9

Parece que o arquivo deve ser armazenado sob controle de versão . Eu proporia mantê-lo no git, mas ignore todas as alterações locais:

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

Ao alternar ramificações, pode haver conflito nesses arquivos. Em seguida, você pode usar o seguinte script imlreset para redefinir os arquivos:

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

Crie um script semelhante para ignorar esses arquivos, se você o fizer com frequência.

Paweł Nadolski
fonte
Isso não evita problemas ao alternar ramificações; se o IDE alterar o arquivo, as alterações deverão ser removidas de alguma forma antes que você possa fazer check-out de uma ramificação diferente.
ergosys 17/02
@ergosys, obrigado pelo comentário. Adicionado script que eu uso nesses casos.
Paweł Nadolski
1
Ignorar o arquivo é uma solução anti e nem mesmo uma solução alternativa benéfica. Não remedia a causa, oculta os sintomas e, ao fazê-lo, cria e oculta problemas simples, tornando-os difíceis de encontrar e corrigir.
Barry Staes
@ BarryStaes, obrigado pelo feedback. Não encontrei a solução perfeita para esse problema (outras soluções não funcionaram) e esta funciona para mim e poucas outras pessoas. Observe que isso não ignora completamente os arquivos, apenas oculta o fato de que eles foram alterados. Como esses arquivos podem mudar frequentemente e aleatoriamente, permite filtrá-los ao executar comandos git. Você ainda pode comprometê-los quando quiser.
Paweł Nadolski
1

Resolvi esse problema quando removi e parei de confirmar a pasta .idea no controle de origem.

O problema é que alguns desses arquivos são configurações específicas da máquina, portanto, compartilhá-los pode ser um problema.

Removê-lo e outros arquivos incorretos foi um processo git de duas etapas:

1) Adicione 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 linha do .gitignore, execute git rm line partir da linha de comando.

Exemplo:

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

Adicione e confirme as alterações

Agora, esses arquivos serão gerados quando você abrir o projeto Android Studio e não serão adicionados ao git.

kraftydevil
fonte
20
De acordo com intellij-support.jetbrains.com/hc/en-us/articles/…, você deve comprometer a maior parte da .ideapasta porque eles não são específicos da máquina, exceto workspace.xmle tasks.xml. Dito isto, não é muito bem pensado em termos de controle de versão, devido a problemas como esses. Eu acho que eles eventualmente resolverão a bagunça.
Matt Quigley
Eu entendo que existem discrepâncias. Ao mesmo tempo, não conheço nenhum problema na minha equipe de desenvolvimento ao usar este .gitignore. Se soubesse mais, poderia aconselhar mais, mas é isso que está funcionando para nós no momento. Se um problema aparecer, mudarei minha resposta.
kraftydevil
31
Sim, todos sabemos como forçar o git a ignorar esse arquivo. Mas a verdadeira questão é por que ela continua mudando de JDK_1_8 para JDK_1_7 (e às vezes volta)?
Scott Biggs
Começou a acontecer comigo com o Android Studio 2.2. Eu acho que eles empacotaram o JDK começando com o AS 2.2, então é possível que ele fique confuso entre o sistema e o sistema operacional do AS.
RED_ 17/10/19
3
Isso não responde à pergunta. O que é estranho, porque você perguntou. Isto é como ignorar o problema, o que pode ser bom para você, eu acho, eu gostaria de saber por que ele continua mudando e como impedi-lo de fazer isso.
David