Znacznik languageLevel Androida .idea / misc.xml ciągle zmienia pakiety JDK

178

Klucz languageLevel został zmieniony z JDK_1_8 na JDK_1_7 z powodów, których nie znam.

Co może się dziać?

Czy ma to coś wspólnego z IDE innych programistów pracujących nad projektem? Może mają inne ustawienie Android Studio?

Oto, co pojawia się po tym, jak zauważyłem, że pliki pod kontrolą źródła uległy zmianie:

$ 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">

To mój gitignore na wszelki wypadek.

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

Jak postępować tak, aby pozostało tak czy inaczej?

kraftydevil
źródło
1
Zrobiłem. Dodano odpowiedź.
kraftydevil
4
Chciałbym tylko zaznaczyć, że intellij-support.jetbrains.com/hc/en-us/articles/… jest oficjalną odpowiedzią na to, co powinno być .gitignore, i to obejście jest temu przeciwne. Tracisz możliwość udostępniania właściwości projektu wszystkim programistom, takich jak ustawienia inspekcji / kłaczków, których używamy, aby zapobiec niektórym standardowym złym praktykom przed przejściem do przeglądu kodu. Możesz po prostu dodać /.idea/misc.xmldo .gitignorepliku, aby rozwiązać ten problem.
Matt Quigley,
4
Sam zauważyłem ten problem i nawet po tym, jak inny członek zespołu popełnił pracę. Zrobiłem własną pracę, wcisnąłem zatwierdzenie, wykonałem trochę pracy i zauważyłem, że znów mnie to zaskoczyło. To mnie bardziej martwi. Jeśli jest to inny członek zespołu, to wiem, dlaczego się zmienia, ale przypadkowa zmiana podczas osobistego rozwoju lokalnego jest niepokojąca i myląca. Wgląd w to?
John Shelley,
3
Mam ten sam problem, poziom języka zmienia się między 1,7 a 1,8.
Han He
1
temat związany z stackoverflow.com/questions/17637179/…
CrandellWS

Odpowiedzi:

42

Przez jakiś czas doprowadzało mnie to do szału. Byłem w stanie to naprawić, jawnie ustawiając wersję Java w moim build.gradle:

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

Pamiętaj, że jeśli używasz VERSION_1_7, kiedy uruchomisz na zimno Android Studio lub przełączysz się na inny projekt, który używa VERSION_1_8, zmodyfikuje się, .idea/misc.xmlaby użyć JDK_1_8. Wykonanie synchronizacji stopniowej przywróci ją do używania JDK_1_7. Jeśli używasz VERSION_1_8, nie będziesz mieć tego problemu.

To nie jest idealne, ale na razie uważam, że to wystarczy.

kolęda
źródło
2
Obecnie nie używaj ani nie chcesz używać osadzonego pakietu JDK, jak sugerowano w stackoverflow.com/a/40083824/1815624, użycie opcji gradle zapobiega zmianie problemu. Może chciałbym to odnotować code.google.com/p/android/issues/detail?id=172115
CrandellWS
Czy powinienem to umieścić w projekcie czy w pliku modułu?
rraallvv
@rraallvv moduł
Noel
Ten rodzaj „naprawia” to dla mnie. Mam te opcje w pliku oceny. Jeśli otworzę studio (wykonuje synchronizację stopni i), ustawi misc.xml na 1_8. Jeśli zbuduję, to zostanie ponownie ustawiony na 1_7. Jeśli następnie zsynchronizuję grad, zostanie ustawiony z powrotem na 1_8, a budynek nie będzie już ustawiał z powrotem na 1_7. Przeprowadzanie synchronizacji gradnej nigdy nie ustawia dla mnie na 1_7, zawsze jest to 1_8 po synchronizacji stopniowej. Za każdym razem, gdy otwieram studio, ustawia się na 1_8.
David
Jeśli chcesz użyć JDK 1.8: android {compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}}
Beatrice Lin
24

Przyszedł tutaj z Google po aktualizacji do Android Studio 2.2. Może to być pomocne dla innych.

Od Android Studio 2.2 pakiet JDK jest dołączany do niego, zamiast konieczności pobierania i instalowania go w systemie. Mój projekt JDK zaczął się przełączać, kiedy zaktualizowałem do wersji 2.2, być może z powodu zamieszania między dwiema dostępnymi teraz wersjami - systemową i wbudowaną.

Jeśli przejdziesz do Plik> Struktura projektu (Mac OS), na karcie Lokalizacja SDK znajduje się lokalizacja JDK. Teraz jest nowe ustawienie do używania wbudowanego JDK. Po przejściu na to rozwiązało mój problem.

wprowadź opis zdjęcia tutaj

CZERWONY_
źródło
7
Zrobiłem to (choć w Win10), ale jak tylko zrestartowałem AS, zauważyłem, że problem nadal występuje :(
CesarPim,
2
Działa to w celu rozwiązania problemu. Jak wspomina @CesarPim, widzę, że pojawia się ponownie, gdy kompilacja nie jest zsynchronizowana. Uruchomienie synchronizacji gradacji usuwa następnie zmianę. Ogólnie ładne, czyste rozwiązanie, znacznie lepsze niż było wcześniej - dzięki!
Gene Bo,
5
Co masz na myśli @gnB? Ze mną ciągle się zmienia między 1,7 a 1,8 ... nie byłem w stanie znaleźć stabilnego rozwiązania. Byłeś?
CesarPim,
3
@gnB tak, to samo ze mną, ale wciąż mnie niepokoi, że dzieje się to za każdym razem, gdy uruchamiam AS ... to nie powinno się zdarzyć
CesarPim
15
Nadal dzieje się w Android Studio 3.0, a ta sugestia go nie naprawiła. Mam już zaznaczone „osadzone JDK”, a mimo to wciąż zmienia się z 1_7 na 1_8 iz powrotem bez wyraźnego powodu.
Greg Ennis,
9

Wygląda na to, że plik powinien być przechowywany pod kontrolą wersji . Proponuję zachować to w git, ale zignoruj ​​wszystkie lokalne zmiany:

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

Podczas przełączania gałęzi może występować konflikt w tych plikach. Następnie możesz użyć następującego skryptu imlreset, aby zresetować pliki:

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

Utwórz podobny skrypt do ignorowania tych plików, jeśli robisz to często.

Paweł Nadolski
źródło
Nie pozwala to uniknąć problemów przy zmianie gałęzi, jeśli IDE zmieni plik, zmiany muszą zostać jakoś usunięte, zanim będzie można pobrać inną gałąź.
ergosys
@ergosys, dzięki za komentarz. Dodano skrypt, którego używam w takich przypadkach.
Paweł Nadolski
1
Ignorowanie pliku jest rozwiązaniem anty, a nawet nie jest korzystnym obejściem. Nie usuwa przyczyny, ukrywa objawy, a przez to tworzy i ukrywa proste problemy, przez co trudno jest je znaleźć i naprawić.
Barry Staes,
@BarryStaes, dzięki za opinie. Nie znalazłem idealnego rozwiązania tego problemu (inne rozwiązania nie działały), a to działa dla mnie i kilku innych osób. Pamiętaj, że nie jest to całkowicie ignorowanie plików, a jedynie ukrycie faktu, że zostały zmienione. Ponieważ pliki te mogą często i losowo się zmieniać, pozwala to filtrować je podczas wykonywania poleceń git. Nadal możesz je zatwierdzić, kiedy tylko chcesz.
Paweł Nadolski
1

Rozwiązałem ten problem, gdy usunąłem i przestałem przekazywać folder .idea do kontroli źródła.

Problem polega na tym, że niektóre z tych plików są konfiguracjami specyficznymi dla maszyny, więc ich udostępnienie może być problemem.

Usunięcie go i innych szkodliwych plików było dwuetapowym procesem git:

1) Dodaj .gitignore (z 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) Uruchom każdą linię .gitignore git rm line z linii poleceń.

Przykład:

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

Dodaj i zatwierdź zmiany

Teraz te pliki zostaną wygenerowane po otwarciu projektu Android Studio i nie zostaną dodane do git.

kraftydevil
źródło
20
Zgodnie z intellij-support.jetbrains.com/hc/en-us/articles/… należy popełnić większość .ideafolderu, ponieważ nie są one specyficzne dla komputera, z wyjątkiem workspace.xmli tasks.xml. Biorąc to pod uwagę, nie jest to zbyt dobrze przemyślane pod względem kontroli wersji z powodu takich problemów. Myślę, że w końcu załatwią bałagan.
Matt Quigley,
Rozumiem, że istnieją rozbieżności. Jednocześnie nie jestem świadomy żadnych problemów w moim zespole deweloperów podczas korzystania z tego .gitignore. Gdybym wiedział więcej, mógłbym doradzić dalej, ale to właśnie działa teraz dla nas. Jeśli pojawi się problem, zmienię odpowiedź.
kraftydevil
31
Tak, wszyscy wiemy, jak zmusić git do zignorowania tego pliku. Ale prawdziwe pytanie brzmi: dlaczego ciągle zmienia się z JDK_1_8 na JDK_1_7 (a czasem z powrotem)?
Scott Biggs,
Zaczęło mi się dziać ze Android Studio 2.2. Myślę, że dołączają pakiet JDK, zaczynając od AS 2.2, więc możliwe jest, że ciągle się myli między systemem a systemem w AS.
RED_
3
To w ogóle nie odpowiada na pytanie. Co jest dziwne, ponieważ o to pytałeś. Oto jak zignorować problem, co może być dla ciebie w porządku. Chciałbym wiedzieć, dlaczego ciągle się zmienia i jak to zrobić.
David