Тег мови Android .idea / misc.xmlLivevel постійно змінює JDK


178

Ключ languageLevel змінюється з JDK_1_8 на JDK_1_7 з я не знаю.

Що може статися?

Чи має це щось спільне з IDE інших розробників, які працюють над проектом? Можливо, у них є інша настройка Android Studio?

Ось що з'являється після того, як я помітив, що файли під контролем джерела змінилися:

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

Це мій гітігнор у випадку, якщо це має значення.

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

Як мені діяти так, щоб він залишався так чи інакше?


1
Я зробила. Відповідь додано.
kraftydevil

4
Я просто хочу зазначити, що intellij-support.jetbrains.com/hc/en-us/articles/… є офіційною відповіддю на те, що має бути .gitignore, і це рішення суперечить цьому. Ви втрачаєте деяку здатність ділитися властивостями проекту з усіма розробниками, наприклад, інспекцій / налаштувань ворсинок, які ми використовуємо для запобігання деяких стандартних шкідливих практик, перш ніж перейти до огляду коду. Ви можете просто додати /.idea/misc.xmlу .gitignoreфайл, щоб вирішити це.
Метт Квіглі

4
Я сам помітив це питання, і його навіть не було після того, як інший член команди приступив до роботи. Я зробив свою роботу, підштовхнув зобов’язання, зробив ще якусь роботу і помітив, що вона знову ввімкнула мене. Саме це мене більше хвилює. Якщо його інший член команди, то я знаю, чому це змінюється, але випадково змінюватися під час особистого місцевого розвитку - це заплутано і заплутано. Будь-яке розуміння цього?
Джон Шеллі

3
У мене така ж проблема, рівень мови постійно змінюється між 1,7 і 1,8.
Хань Він

1
тема, пов’язана з stackoverflow.com/questions/17637179/…
CrandellWS

Відповіді:


42

Це на деякий час мене ганяло. Я зміг це виправити, чітко встановивши версію java в моєму build.gradle:

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

Зауважте, що якщо ви користуєтесь VERSION_1_7, коли ви холодно запускаєте Android Studio або переходите на інший проект, який використовує VERSION_1_8, він буде змінено .idea/misc.xmlдля використання JDK_1_8. Здійснення синхронізації з Gradle поверне його до використання JDK_1_7. Якщо ви користуєтесь VERSION_1_8, у вас не буде цієї проблеми.

Це не ідеально, але я вважаю, що це зараз досить добре.


2
В даний час не використовує ні хоче використовувати вбудовувати JDK , як запропоновано в stackoverflow.com/a/40083824/1815624 використання Gradle варіанти дійсно запобігти змінюється проблему. Можливо, хочете зазначити це, хоча code.google.com/p/android/isissue/detail?id=172115
CrandellWS

Чи слід це ставити в проект або у файл модуля?
rraallvv

@rraallvv the module
Noel

Цей вид «виправляє» це для мене. Ці параметри у мене є у файлі gradle. Якщо я відкрию студію (вона робить синхронізацію з Gradle та), вона встановлює misc.xml на 1_8. Якщо я будую тоді, він повернеться до рівня 1_7. Якщо я потім синхронізую gradle, він буде встановлений на 1_8, і при його створенні більше не буде встановлено значення 1_7. Якщо синхронізація Gradle синхронізує ніколи, вона не встановлює його 1_7, це завжди 1_8 після синхронізації Gradle. Щоразу, коли я відкриваю студію, вона встановлюється на 1_8.
Девід

Якщо ви хочете використовувати JDK 1.8: android {compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}}
Беатріче Лін

24

Прийшов сюди з Google після оновлення до Android Studio 2.2. Це може бути корисним для інших.

З Android Studio 2.2 JDK постачається разом із ним, замість того, щоб завантажувати та встановлювати його у вашій системі. Мій проект JDK почав перемикатися, коли я оновив до 2.2, можливо через плутанину між двома доступними зараз версіями - системною та вбудованою.

Якщо ви перейдете у меню Файл> Структура проекту (Mac OS), на вкладці Місце розташування SDK є місце JDK. Зараз є нова настройка для використання вбудованого JDK. Як тільки я перейшов на це, це вирішило моє питання.

введіть тут опис зображення


7
Я зробив це (хоча в Win10), але як тільки я перезапустив AS, я помітив, що проблема продовжується :(
CesarPim

2
Це працює для вирішення проблеми. Як згадує @CesarPim, я бачу, що він повертається на поверхню, коли збірка не синхронізована. Запуск синхронізації gradle потім очищає зміни. Загалом приємне чисте рішення, набагато краще, ніж було раніше - дякую!
Джин Бо

5
Що ти маєш на увазі @gnB? Що стосується мене, він продовжує рухатися вперед і назад між 1.7 і 1.8 ... я не зміг знайти стабільне рішення. Чи були ви?
CesarPim

3
@gnB так, те саме і зі мною, але все одно мене турбує те, що це відбувається кожен раз, коли я запускаю AS ... цього не повинно статися
CesarPim

15
Все ще відбувається в Android Studio 3.0, і ця пропозиція її не виправила. У мене вже вибрано "вбудований JDK", але він все ще змінюється від 1_7 до 1_8 і назад без видимих ​​причин.
Грег Енніс

9

Здається, файл слід зберігати під контролем версій . Я б запропонував зберегти це в git, але ігнорувати всі локальні зміни:

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

При перемиканні гілок може виникнути конфлікт у цих файлах. Тоді ви можете використовувати наступний скрипт imlreset для скидання файлів:

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

Створіть подібний сценарій для ігнорування цих файлів, якщо ви робите це часто.


Це не дозволяє уникнути проблем при перемиканні гілок, якщо IDE змінює файл, зміни потрібно якось видалити, перш ніж ви зможете отримати іншу гілку.
ergosys

@ergosys, дякую за коментар. Доданий сценарій, який я використовую в таких випадках.
Paweł Nadolski

1
Ігнорування файлу - це анти-рішення, і навіть не корисне рішення. Він не усуває причини, він приховує симптоми, і тим самим створює і приховує прості проблеми, щоб їх стало важко знайти та виправити.
Баррі Стейс

@BarryStaes, дякую за відгук. Я не знайшов ідеального рішення для цього питання (інші рішення не спрацювали), і це працює для мене та кількох інших людей. Зауважте, що це не повністю ігнорування файлів, лише приховуючи факт їх зміни. Оскільки ці файли часто і випадково можуть змінюватися, це дозволяє фільтрувати їх під час виконання команд git. Ви все ще можете зробити їх коли завгодно.
Paweł Nadolski

1

Цю проблему я вирішив, коли видалив та припинив виконувати папку .idea для керування джерелом.

Проблема полягає в тому, що деякі з цих файлів є специфічними для машини конфігураціями, тому обмін ними може бути проблемою.

Видалення цього файлу та інших файлів-образливих файлів було двоетапним процесом git:

1) Додайте цей .gitignore (з 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) Для кожного рядка .gitignore запустіть git rm lineз командного рядка.

Приклад:

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

Додайте та введіть зміни

Тепер ці файли будуть створені, коли ви відкриєте проект Android Studio, і вони не будуть додані до git.


20
Відповідно до intellij-support.jetbrains.com/hc/en-us/articles/… ви повинні скористатись більшою частиною .ideaпапки, оскільки вони не є специфічними для машини, за винятком workspace.xmlі tasks.xml. За словами, це не дуже продумано з точки зору контролю версій через такі проблеми. Я думаю, що вони врешті-решт розберуть безлад.
Метт Квіглі

Я розумію, є розбіжності. У той же час я не знаю жодних проблем моєї команди розробників від використання цього .gitignore. Якби я знав більше, я міг би порадити далі, але це те, що зараз працює для нас. Якщо питання виникне, я зміню свою відповідь.
kraftydevil

31
Так, всі ми знаємо, як змусити git ігнорувати цей файл. Але справжнє питання: чому він продовжує змінюватися з JDK_1_8 на JDK_1_7 (а іноді і знову)?
Скотт Біггс

Почалося зі мною траплятися з Android Studio 2.2. Я думаю, що вони вбудовували JDK, починаючи з AS 2.2, тому можливо, що він продовжує плутатись між системною системою та системою AS.
RED_

3
Це зовсім не відповідає на питання. Що дивно, тому що ви це запитували. Ось як ігнорувати проблему, яка може бути для вас прекрасною, я думаю, я хотів би знати, чому вона постійно змінюється і як зупинити її на цьому.
Девід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.