IntelliJ IDEA如何确定Gradle语言级别?

17

IntelliJ自带的JetGradle插件显示我的项目存在冲突。它指出我的IDE语言级别是1.7,而我的Gradle语言级别是1.6。

下面的代码将输出所有内容的1.7:

compileJava {
    println project.sourceCompatibility
    println project.targetCompatibility
    println sourceCompatibility
    println targetCompatibility
}

在命令行中运行Gradle正常,IDEA中也能正常运行,两者都使用1.7 JDK。我的IDEA项目和模块也配置为使用1.7。

但是当我通过Gradle构建脚本导入项目时,默认版本为1.6。我已将其更改为1.7。

"Gradle语言级别"是什么?我如何修改它?

谢谢!


你不能使用Gradle来完成这个任务,但是,在运行"./gradlew idea"之后,在IDEA中“导入项目”,有一个语言下拉选择器。在完成项目导入之前,你可以在那里简单地选择它。 - Robert Christian
4个回答

9
Gradle没有通过工具API公开语言级别,因此我认为这只是在Intellij中定义的“默认项目”语言。您可以在此jetbrains youtrack ticket中查看详细信息,并跟踪相应的gradle问题。
至于“如何修复它”,我认为唯一真正的选择是不使用jetgradle并使用gradle idea插件。Intellij 12.1将拥有大大改进的jetgradle插件,但如果信息不在工具API上,则很难看出如何解决此问题。

编辑:Gradle刚刚发布了2.11版本的RC,其中(终于!)包括了这个功能,请参见发布说明获取详细信息,该说明解释了该支持适用于工具API(即IntelliJ JetGradle)和Gradle IDEA插件。


那张票据可能是目前为止最好的答案了。谢谢。 - tnunamak
2
我们已经到了Gradle 15.0,但问题仍未解决。 - Asaf Mesika
这取决于 https://issues.gradle.org/browse/GRADLE-2198,而且Gradle还没有解决这个问题,但有人可以向Gradle发送PR以将其添加到工具API中。 - Matt

4

我有点晚了,但我使用这个来解决问题:

apply plugin: 'idea'

allprojects {
  sourceCompatibility = 1.8
  targetCompatibility = 1.8
}

idea {
  project {
    jdkName = sourceCompatibility
    languageLevel = sourceCompatibility
    ipr {
      withXml {

        def xml = """<component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="\$PROJECT_DIR\$" />
        <option name="gradleJvm" value="$sourceCompatibility" />
        <option name="modules">
          <set>
            <option value="\$PROJECT_DIR\$" />
          </set>
        </option>
        <option name="myModules">
          <set>
            <option value="\$PROJECT_DIR\$" />
          </set>
        </option>
      </GradleProjectSettings>
    </option>
  </component>"""

        def node = it.asNode()
        node.append(new XmlParser().parseText(xml))
      }
    }
  }

  module {
    iml {
      withXml {
        def root = it.asNode()
        root.@'external.linked.project.id' = project.name
        root.@'external.linked.project.path' = '$MODULE_DIR$'
        root.@'external.root.project.path' = '$MODULE_DIR$'
        root.@'external.system.id' = "GRADLE"
        root.@'external.system.module.group' = project.group
        root.@'external.system.module.version' = project.version
      }
    }
  }
}

请使用./gradlew idea命令生成项目元数据,该元数据将把项目语言设置为1.8。注意:Gradle Idea插件只处理基于文件而非目录(.idea/)的元数据。如果您将其应用于使用基于目录的元数据的现有项目,则需要删除项目根目录中的.idea/文件夹。
请注意:将jdkName设置为“1.8”假定在Intellij中注册了一个名为“1.8”的Java SDK。
更新1: 生成的ipr文件包含此块,表明使用Java 1.8(请注意“languageLevel”和“project-jdk-name”属性)。
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" assert-keyword="true" jdk-15="true" project-jdk-type="JavaSDK" assert-jdk-15="true" project-jdk-name="1.8">
  <output url="file://$PROJECT_DIR$/out"/>
</component>

这应该与您在“项目结构”对话框中看到的直接对应:Intellij and Gradle JDK Lang Level 更新2:在项目加载时,Intellij会提示您“导入Gradle项目”。由于某种原因,这会忽略ipr文件中配置的语言级别,并默认为1.6。解决方法是预先配置ipr和适用的iml文件,使其意识到Gradle集成。这样,您就不会被提示导入Gradle项目,并且语言级别保持在1.8。上面的代码块已更新以包括必要的配置。

1
对我来说不起作用。我已经将插件和配置添加到gradle脚本中,运行了gradle任务,但是在将项目重新导入IntelliJ后,源代码兼容性仍然是1.6。我在IntelliJ中检查了SDK的名称,它是1.8,所以我想这应该可以工作。也许有什么想法吗? - racs
好的,我找到了:我使用的是Gradle 2.5。一旦升级到2.9,它就开始工作了。感谢您的帮助! - racs
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - noelob
1
@MicahZoltu,我现在也遇到了同样的问题;在点击“导入Gradle项目”后,即使在导入对话框中将Gradle JVM保留在我的1.8 SDK上,语言级别仍然设置为1.6 :( 我还没有找到原因或解决方法(除了在项目设置中手动设置语言级别)。我会考虑如何解决这个问题。只要您不导入,它就会尊重Gradle在.ipr文件中设置的语言级别,但这真的否定了IDE中的I。 - noelob
1
我已经想出如何让它工作了。你必须自定义IPR,使其已经意识到Gradle集成,然后它会保持语言级别不变 :) 请参见上面的更新2和修改后的示例代码(您可能需要向下滚动才能查看全部)。添加更新的配置后,请使用./gradlew cleanIdea idea刷新Intellij元数据。 - noelob
显示剩余9条评论

3

这似乎不被支持,但这是一个简单的一次性修复。

  • 导航到:文件->项目结构,在
  • 项目设置下选择“模块”(应该已经)将“语言级别”更改为7.0

或者

  • 深入到文件中实际编译错误。通常这是 在catch块中处理多个错误之类的问题。
  • 选择弹出的红色帮助器图标,“将语言级别设置为1.7”

1
我有一个Java/Kotlin项目。在尝试了一些操作之后,我发现在gradle.build中应用插件的顺序实际上会影响模块本身或主要源集是否具有正确的语言级别:
plugins {
    id 'org.jetbrains.kotlin.jvm' apply false
    id 'idea'
}
// have to apply in this order to fix idea.module.languageLevel
apply plugin: 'java'
apply plugin: 'org.jetbrains.kotlin.jvm'


sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8

idea {
    module {
        jdkName = '1.8'
        languageLevel = new IdeaLanguageLevel("1.8")
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接