Тег 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

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


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. Как только я переключился на это, это решило мою проблему.

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


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.


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.