首页 文章

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

提问于
浏览
16

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

谢谢!

3 回答

  • 9

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

    您可以在此_1506285中查看详细信息并追溯到相应的gradle问题

    至于"how to fix it",我认为唯一真正的选择是不使用使用jetgradle并使用gradle idea plugin . Intellij 12.1将有一个much improved jetgradle plugin,但如果信息不在工具api上,那么很难看出如何解决这个问题 .

    编辑:Gradle刚刚发布了一个2.11的RC(最后!)包括这个功能,详情请参见the release notes,这解释了这个工具api(即intellij jetgradle)和gradle idea插件的支持 .

  • 3

    我在这里玩游戏有点晚了,但我用它来解决这个问题:

    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 . 上面的代码块已更新为包含必要的配置 .

  • 4

    它似乎不受支持,但它是一个简单的一次性修复 .

    • 导航至:文件 - >项目结构选择"Modules"下

    • 项目设置 . (应该已经是)将"Language level"更改为7.0

    另外

    • 深入查看文件中的实际编译错误 . 通常这类似于处理catch块中的多个错误 .

    • 选择弹出的红色助手图标,然后"set language level to 1.7"

相关问题