Android .idea / misc.xml的languageLevel标签不断更改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之间不断变化。
汉和

Answers:


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
当前,不使用也不希望按照stackoverflow.com/a/40083824/1815624 中的建议使用嵌入式JDK,使用gradle选项确实可以防止更改。可能想通过code.google.com/p/android/issues/detail?id=172115
CrandellWS

我应该将其放在项目中还是模块文件中?
rraallvv

@rraallvv模块
Noel

这种“修复”对我来说。我的gradle文件中有这些选项。如果我打开工作室(它执行gradle同步并且),它将misc.xml设置为1_8。如果我进行构建,它将设置回1_7。如果我然后同步gradle,它将被设置回1_8,而构建将不再将其设置回1_7。对我而言,执行gradle同步永远不会将其设置为1_7,在gradle同步之后始终为1_8。每当我打开Studio时,它都会设置为1_8。
大卫,

如果您想使用JDK 1.8:android {compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}}
Beatrice Lin

24

更新到Android Studio 2.2后从Google来到这里。这可能对其他人有帮助。

从Android Studio 2.2开始,已将JDK捆绑在一起,而不必下载并在系统上安装。当我更新到2.2时,我的项目JDK开始切换,可能是由于现在可用的两个版本(系统版本和嵌入式版本)之间的混淆。

如果进入“文件”>“项目结构”(Mac OS),则在“ SDK位置”选项卡上,存在JDK位置。现在有了使用嵌入式JDK的新设置。切换到它后,它解决了我的问题。

在此处输入图片说明


7
我这样做了(尽管在Win10中),但是当我重新启动AS后,我注意到问题仍然存在:(
CesarPim

2
这可以解决问题。正如@CesarPim提到的,我看到当构建不同步时,它确实会重新出现。运行gradle同步,然后清除更改。总体而言,这是一个不错的清洁解决方案,比以前要好得多-谢谢!
Gene

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 '17

@ergosys,感谢您的评论。添加了我在这种情况下使用的脚本。
帕维尔Nadolski

1
忽略文件是一种反解决方案,甚至不是一种有益的解决方法。它不能补救原因,而是隐藏了症状组,从而造成并掩盖了简单的问题,从而使它们变得难以发现和修复。
巴里·史塔斯

@BarryStaes,感谢您的反馈。我没有找到解决此问题的完美解决方案(其他解决方案无效),并且该解决方案对我和其他几个人都有效。请注意,这并不能完全忽略文件,而只是隐藏文件已更改的事实。由于这些文件可以经常随机更改,因此可以在执行git命令时对其进行过滤。您仍然可以随时提交它们。
帕维尔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.xmltasks.xml。话虽这么说,由于诸如此类的问题,在版本控制方面还没有考虑周全。我认为他们最终会解决问题。
马特·奎格利

我了解有差异。同时,我不知道使用此.gitignore会对开发团队造成任何问题。如果我知道更多,我可以提供进一步的建议,但这就是我们现在需要的。如果出现问题,我将更改答案。
kraftydevil

31
是的,我们都知道如何强制git忽略此文件。但是真正的问题是为什么它不断从JDK_1_8更改为JDK_1_7(有时又更改为JDK)?
Scott Biggs's

Android Studio 2.2开始出现在我身上。我认为他们从AS 2.2开始就捆绑了JDK,因此有可能使系统与AS中的一个系统混淆。
RED_

3
这根本不能回答问题。这是很奇怪的,因为您提出了要求。这是一种忽略问题的方法,我想这可能对您很好,我想知道为什么它会不断变化以及如何阻止它继续这样做。
大卫,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.