Тег languageLevel Android .idea / misc.xml постоянно меняет 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">

Это мой gitignore на случай, если это имеет значение.

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

Как мне поступить так, чтобы он оставался в том или ином виде?

kraftydevil
источник
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/issues/detail?id=172115
CrandellWS
Должен ли я положить это в проекте или в файле модуля?
rraallvv
@rraallvv модуль
Ноэль
Этот вид "исправляет" это для меня. У меня есть эти опции в моем файле Gradle. Если я открываю студию (она выполняет синхронизацию и), она устанавливает misc.xml в 1_8. Если я соберу тогда, он вернется к 1_7. Если я затем синхронизирую gradle, он вернется к 1_8, а build больше не вернет его к 1_7. Выполнение Gradle Sync никогда не устанавливает для меня 1_7, оно всегда 1_8 после Gradle Sync. Каждый раз, когда я открываю студию, она устанавливается на 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. Как только я переключился на это, это решило мою проблему.

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

red_
источник
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, спасибо за комментарий. Добавлен скрипт, который я использую в таких случаях.
Павел
1
Игнорирование файла - это анти-решение и даже не полезный обходной путь. Это не устраняет причину, оно скрывает симптомы, и таким образом создает и затеняет простые проблемы, так что их становится трудно найти и исправить.
Барри Стейс
@BarryStaes, спасибо за отзыв. Я не нашел идеального решения для этой проблемы (другие решения не работали), и это работает для меня и нескольких других людей. Обратите внимание, что это не полное игнорирование файлов, а только скрытие того факта, что они изменились. Поскольку эти файлы могут часто и случайно изменяться, это позволяет отфильтровать их при выполнении команд git. Вы все еще можете передать их, когда захотите.
Павел Надольский
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.

kraftydevil
источник
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
Это не отвечает на вопрос вообще. Что странно, потому что ты спросил это. Это то, как игнорировать проблему, что может быть хорошо для вас, я думаю, я хотел бы знать, почему она продолжает меняться и как это остановить.
Дэвид