Das languageLevel-Tag von Android .idea / misc.xml ändert ständig die JDKs

178

Der languageLevel-Schlüssel wird aus mir unbekannten Gründen von JDK_1_8 in JDK_1_7 geändert.

Was könnte los sein?

Hat dies etwas mit der IDE anderer Entwickler zu tun, die an dem Projekt arbeiten? Vielleicht haben sie eine andere Android Studio-Einstellung?

Folgendes wird angezeigt, nachdem ich festgestellt habe, dass sich Dateien unter Quellcodeverwaltung geändert haben:

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

Dies ist mein Gitignore, falls es darauf ankommt.

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

Wie gehe ich vor, damit es nur so oder so bleibt?

Kraftydevil
quelle
1
Ich tat. Antwort hinzugefügt.
Kraftydevil
4
Ich möchte nur darauf hinweisen, dass Intellij-support.jetbrains.com/hc/en-us/articles/… die offizielle Antwort auf das ist, was enthalten sein sollte .gitignore, und diese Problemumgehung widerspricht dem . Sie verlieren die Möglichkeit, Projekteigenschaften für alle Entwickler freizugeben, z. B. Inspektionen / Fluseneinstellungen, mit denen wir einige Standardfehler verhindern, bevor Sie überhaupt mit der Codeüberprüfung beginnen. Sie können einfach /.idea/misc.xmlzur .gitignoreDatei hinzufügen , um dies zu lösen.
Matt Quigley
4
Ich habe dieses Problem selbst bemerkt und es war nicht einmal, nachdem ein anderes Teammitglied Arbeit geleistet hatte. Ich habe meine eigene Arbeit gemacht, ein Commit gepusht, noch etwas gearbeitet und festgestellt, dass es mich wieder angemacht hat. Das geht mich mehr an. Wenn es sich um ein anderes Teammitglied handelt, weiß ich, warum es sich ändert, aber zufällig während der persönlichen lokalen Entwicklung zu ändern, ist besorgniserregend und verwirrend. Irgendein Einblick in dieses?
John Shelley
3
Ich habe das gleiche Problem, das Sprachniveau ändert sich ständig zwischen 1,7 und 1,8.
Han He
1
Thema im Zusammenhang mit stackoverflow.com/questions/17637179/…
CrandellWS

Antworten:

42

Das machte mich eine Weile verrückt. Ich konnte es beheben, indem ich die Java-Version explizit in meinem build.gradle:

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

Beachten Sie , wenn Sie verwenden VERSION_1_7, wenn Sie Android Studio oder Switch in ein anderes Projekt starten , kalt , dass Anwendungen VERSION_1_8, es ändern wird .idea/misc.xmlzu verwenden JDK_1_8. Wenn Sie eine Gradle-Synchronisierung durchführen, wird diese wieder verwendet JDK_1_7. Wenn Sie verwenden VERSION_1_8, tritt dieses Problem nicht auf.

Es ist nicht perfekt, aber ich fand das vorerst gut genug.

Noel
quelle
2
Verwenden oder verwenden Sie das eingebettete JDK derzeit nicht, wie in stackoverflow.com/a/40083824/1815624 vorgeschlagen. Die Verwendung der Option gradle verhindert das sich ändernde Problem. Vielleicht
CrandellWS
Soll ich das in das Projekt oder in die Moduldatei einfügen?
rraallvv
@raallvv das Modul
Noel
Diese Art von "behebt" es für mich. Ich habe diese Optionen in meiner Gradle-Datei. Wenn ich Studio öffne (es führt eine Gradle-Synchronisierung durch und), wird misc.xml auf 1_8 gesetzt. Wenn ich dann baue, wird es auf 1_7 zurückgesetzt. Wenn ich dann gradle synchronisiere, wird es auf 1_8 zurückgesetzt und das Gebäude wird es nicht mehr auf 1_7 zurücksetzen. Wenn ich Gradle Sync mache, wird es für mich nie auf 1_7 gesetzt, nach einer Gradle Sync ist es immer 1_8. Jedes Mal, wenn ich das Studio öffne, wird es auf 1_8 gesetzt.
David
Wenn Sie JDK 1.8 verwenden möchten: android {compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}}
Beatrice Lin
24

Kam nach dem Update auf Android Studio 2.2 von Google hierher. Dies kann für andere hilfreich sein.

Seit Android Studio 2.2 ist das JDK im Lieferumfang enthalten, anstatt dass Sie es herunterladen und auf Ihrem System installieren müssen. Mein Projekt JDK begann zu wechseln, als ich auf 2.2 aktualisierte, möglicherweise aufgrund der Verwechslung zwischen den beiden jetzt verfügbaren Versionen - System und Embedded.

Wenn Sie auf der Registerkarte SDK-Speicherort unter Datei> Projektstruktur (Mac OS) zu Datei gehen, befindet sich der JDK-Speicherort. Es gibt jetzt eine neue Einstellung für die Verwendung des eingebetteten JDK. Sobald ich darauf umgestiegen bin, hat es mein Problem gelöst.

Geben Sie hier die Bildbeschreibung ein

ROT_
quelle
7
Ich tat dies (obwohl in Win10), aber sobald ich AS neu startete, bemerkte ich, dass das Problem weiterhin besteht :(
CesarPim
2
Dies behebt das Problem. Wie @CesarPim erwähnt, taucht es wieder auf, wenn der Build nicht synchron ist. Wenn Sie die Gradle-Synchronisierung ausführen, wird die Änderung gelöscht. Insgesamt eine schöne saubere Lösung, viel besser als vorher - danke!
Gene Bo
5
Was meinst du mit @gnB? Bei mir geht es zwischen 1,7 und 1,8 hin und her ... ich konnte keine stabile Lösung finden. Warst du?
CesarPim
3
@gnB ja, das gleiche mit mir, aber es stört mich immer noch, dass es jedes Mal passiert, wenn ich AS
starte
15
Dies geschieht immer noch in Android Studio 3.0, und dieser Vorschlag hat das Problem nicht behoben. Ich habe bereits "eingebettetes JDK" ausgewählt, und dennoch ändert es sich ohne ersichtlichen Grund von 1_7 auf 1_8 und zurück.
Greg Ennis
9

Es scheint, dass die Datei unter Versionskontrolle gespeichert werden sollte . Ich würde vorschlagen, es in Git zu halten, aber alle lokalen Änderungen ignorieren:

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

Beim Wechseln der Zweige kann es zu Konflikten in diesen Dateien kommen. Dann können Sie das folgende imlreset- Skript verwenden, um die Dateien zurückzusetzen:

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

Erstellen Sie ein ähnliches Skript, um diese Dateien zu ignorieren, wenn Sie dies häufig tun.

Paweł Nadolski
quelle
Dies vermeidet keine Probleme beim Wechseln von Zweigen. Wenn die IDE die Datei ändert, müssen die Änderungen irgendwie entfernt werden, bevor Sie einen anderen Zweig auschecken können.
Ergosys
@ergosys, danke für den Kommentar. Skript hinzugefügt, das ich in solchen Fällen verwende.
Paweł Nadolski
1
Das Ignorieren der Datei ist eine Anti-Lösung und nicht einmal eine nützliche Problemumgehung. Es behebt nicht die Ursache, es verbirgt die Symptome und schafft und verschleiert auf diese Weise einfache Probleme, so dass sie schwer zu finden und zu beheben sind.
Barry Staes
@BarryStaes, danke für das Feedback. Ich habe keine perfekte Lösung für dieses Problem gefunden (andere Lösungen haben nicht funktioniert) und diese funktioniert für mich und wenige andere Personen. Beachten Sie, dass dies die Dateien nicht vollständig ignoriert, sondern nur die Tatsache verbirgt, dass sie sich geändert haben. Da diese Dateien häufig und zufällig geändert werden können, können sie beim Ausführen von Git-Befehlen herausgefiltert werden. Sie können sie weiterhin festschreiben, wann immer Sie möchten.
Paweł Nadolski
1

Ich habe dieses Problem gelöst, als ich den .idea-Ordner entfernt und nicht mehr für die Quellcodeverwaltung festgeschrieben habe.

Das Problem ist, dass einige dieser Dateien maschinenspezifische Konfigurationen sind, sodass die Freigabe ein Problem darstellen kann.

Das Entfernen und anderer fehlerhafter Dateien war ein zweistufiger Git-Prozess:

1) Fügen Sie diesen .gitignore hinzu (von 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) Führen Sie für jede Zeile des Gitignore git rm linedie Befehlszeile aus.

Beispiel:

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

Fügen Sie die Änderungen hinzu und übernehmen Sie sie

Jetzt werden diese Dateien beim Öffnen des Android Studio-Projekts generiert und nicht zu git hinzugefügt.

Kraftydevil
quelle
20
Laut Intellij-support.jetbrains.com/hc/en-us/articles/… sollten Sie den größten Teil des .ideaOrdners festschreiben , da diese außer und nicht maschinenspezifisch sind . Abgesehen davon ist es in Bezug auf die Versionskontrolle aufgrund solcher Probleme nicht sehr gut durchdacht. Ich denke, sie werden das Chaos irgendwann klären. workspace.xmltasks.xml
Matt Quigley
Ich verstehe, dass es Diskrepanzen gibt. Gleichzeitig sind mir keine Probleme in meinem Entwicklerteam durch die Verwendung dieses Gitignore bekannt. Wenn ich mehr wüsste, könnte ich weiter beraten, aber genau das funktioniert gerade für uns. Wenn sich ein Problem ergibt, ändere ich meine Antwort.
Kraftydevil
31
Ja, wir alle wissen, wie man git zwingt, diese Datei zu ignorieren. Aber die eigentliche Frage ist, warum es immer wieder von JDK_1_8 zu JDK_1_7 wechselt (und manchmal wieder zurück).
Scott Biggs
Begann mir mit Android Studio 2.2 zu passieren. Ich denke, sie haben das JDK ab AS 2.2 gebündelt, daher ist es möglich, dass es immer wieder zwischen dem System eins und dem innerhalb von AS verwechselt wird.
RED_
3
Dies beantwortet die Frage überhaupt nicht. Was seltsam ist, weil du es gefragt hast. Auf diese Weise können Sie das Problem ignorieren, was für Sie in Ordnung sein könnte. Ich würde gerne wissen, warum es sich ständig ändert und wie Sie es daran hindern können.
David