IntelliJ IDEA的Gradle语言水平如何确定?

时间:2013-01-21 20:26:34

标签: intellij-idea gradle

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语言级别”,我该如何修改它?

谢谢!

4 个答案:

答案 0 :(得分:9)

Gradle没有通过工具api公开语言级别,所以我认为这只是intellij中定义的“默认项目”语言。

您可以在此jetbrains youtrack ticket

中查看详细信息并追溯到相应的gradle问题

关于“如何解决它”,我认为唯一真正的选择是不使用使用jetgradle&使用gradle idea plugin。 Intellij 12.1将有much improved jetgradle plugin,但如果信息不在工具api上,那么很难看出如何解决这个问题。

编辑:Gradle刚刚发布了一个2.11的RC(最后!)包含了这个功能,请参阅the release notes了解详细信息,这解释了这个工具api(即intellij jetgradle)和gradle的支持想法插件。

答案 1 :(得分: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。上面的代码块已更新为包含必要的配置。

答案 2 :(得分:3)

它似乎不受支持,但它只是一次性修复。

  • 导航至:文件 - &gt;项目结构选择
  • 下的“模块”
  • 项目设置。 (应该已经是)将“语言级别”更改为7.0

可选地

  • 深入查看文件中的实际编译错误。通常这是 比如在catch块中处理多个错误。
  • 选择 弹出的红色助手图标,以及“将语言级别设置为1.7”

答案 3 :(得分: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")
    }
}