【问题标题】:How is IntelliJ IDEA's Gradle language level determined?IntelliJ IDEA 的 Gradle 语言级别是如何确定的?
【发布时间】:2013-01-21 20:26:33
【问题描述】:

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 中“导入项目”时,有一个语言的下拉选择器。在完成项目导入之前,您可以在那里简单地选择它

标签: intellij-idea gradle


【解决方案1】:

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 idea 插件的支持.

【讨论】:

  • 那张票和我想的一样是一个很好的答案。谢谢。
  • 我们在 Gradle 15.0 并且仍然没有修复
  • 嗯,它依赖于issues.gradle.org/browse/GRADLE-2198,而 gradle 还没有解决这个问题,有人可以向 gradle 发送一个 PR 以将其添加到工具 api 中
【解决方案2】:

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

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>

这应该与您在“项目结构”对话框中看到的内容直接对应:

更新 2:在项目加载时,Intellij 会提示您“导入 Gradle 项目”。由于某种原因,这会忽略 ipr 文件中配置的语言级别,默认为 1.6。解决这个问题的方法是预先配置 ipr 和适用的 iml 文件,以便它知道 Gradle 集成。这样,系统不会提示您导入 Gradle 项目,并且语言级别保持在 1.8。上面的代码块已更新为包含必要的配置。

【讨论】:

  • 对我不起作用。我已经将插件和配置添加到 gradle 脚本中,运行了 gradle 任务,但是在将项目导入回 IntelliJ 源代码后,兼容性仍然是 1.6。我已经检查了 IntelliJ 中 SDK 的名称,它是 1.8,所以我想这应该可以工作。有什么想法吗?
  • 嗯,你在 Intellij 中重新加载了项目吗?在项目结构中,SDK 和语言级别是否都设置为 1.8?另外,您使用的是什么版本的 Intellij?
  • 我曾多次尝试生成项目并将其重新导入 IntelliJ。也删除了任何以前的项目文件。不知道为什么它不起作用,也许你可以发现错误,这是我的 gradle 脚本:gist.github.com/almosr/…提前感谢您的帮助!
  • @MicahZoltu 我现在看到了同样的行为;单击“导入 Gradle 项目”后,语言级别设置为 1.6,即使 Gradle JVM 在导入对话框中留在我的 1.8 SDK 中:( 我还没有找到原因或解决方法(除了手动设置项目设置中的语言级别)。我会考虑如何解决这个问题。只要您不导入,它就会尊重 Gradle 在 .ipr 文件中设置的语言级别,但这确实否定了 IDE 中的 I。
  • 我已经弄清楚了如何进行这项工作。您必须自定义 IPR,以便它已经知道 Gradle 集成,然后它只保留语言级别 :) 请参阅上面的更新 2 和修改后的示例代码(您可能需要向下滚动才能查看全部内容)。添加更新后的配置后,使用 ./gradlew cleanIdea idea 刷新 Intellij 元数据
【解决方案3】:

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

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

或者

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

【讨论】:

    【解决方案4】:

    我有一个 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")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-16
      • 2019-09-25
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      相关资源
      最近更新 更多