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

谢谢!

4

4 回答 4

9

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

您可以在这张jetbrains youtrack 票中查看详细信息,并回溯到相应的 gradle 问题

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

编辑:Gradle 刚刚发布了 2.11 的 RC,其中(终于!)包含此功能,有关详细信息,请参阅发行说明,其中解释了对工具 api(即 intellij jetgradle)和 gradle idea 插件的支持。

于 2013-01-21T21:23:00.103 回答
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 和 Gradle JDK 语言级别

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

于 2016-01-06T21:56:43.147 回答
3

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

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

或者

  • 深入到文件中的实际编译错误。通常这类似于在一个 catch 块中处理多个错误。
  • 选择弹出的红色助手图标,“设置语言级别为1.7”
于 2014-04-06T16:30:27.260 回答
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")
    }
}
于 2021-03-24T19:43:56.760 回答