Как определяется уровень языка IntelliJ IDEA Gradle?

Плагин JetGradle, который поставляется с IntelliJ, показывает, что мой проект имеет конфликт. В нем говорится, что мой уровень языка 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 build script, версия по умолчанию равна 1.6. Я изменил его на 1.7.

Что это за "Gradle уровень языка" и как его изменить?

Спасибо!

Ответы

Ответ 1

Gradle не раскрывает языковой уровень с помощью инструмента api, поэтому я бы подумал, что это просто язык проекта по умолчанию, как определено в intellij.

Вы можете увидеть подробности и вернуться к соответствующей проблеме gradle, в этом jetbrains youtrack ticket

Что касается "как исправить это", я думаю, что единственный реальный вариант - не использовать использование jetgradle и использовать Gradle плагин идей. Intellij 12.1 будет иметь значительно улучшенный плагин jetgradle, но если информация не находится на инструменте api, тогда трудно понять, как это можно исправить.

EDIT: gradle только что опубликовали RC для 2.11, который (наконец!) включает эту функцию, см. примечания к выпуску для подробностей что объясняет, что эта поддержка существует как для инструментария api (т.е. intellij jetgradle), так и для плагина идей gradle.

Ответ 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()
        [email protected]'external.linked.project.id' = project.name
        [email protected]'external.linked.project.path' = '$MODULE_DIR$'
        [email protected]'external.root.project.path' = '$MODULE_DIR$'
        [email protected]'external.system.id' = "GRADLE"
        [email protected]'external.system.module.group' = project.group
        [email protected]'external.system.module.version' = project.version
      }
    }
  }
}

Затем используйте ./gradlew idea для генерации метаданных проекта, которые задают язык проекта 1,8. EDIT: плагин с идеей Gradle предназначен только для метаданных, основанных на файлах, а не на основе каталога (.idea/). Если вы примените это к существующему проекту, который использует метаданные на основе каталогов, вам нужно свернуть папку .idea/в корне проекта

Примечание: установка jdkName на "1.8" предполагает, что в Intellij есть Java SDK с именем "1.8".

ОБНОВЛЕНИЕ 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 Lang

ОБНОВЛЕНИЕ 2: При загрузке проекта Intellij предлагает вам "Импортировать Gradle Проект". По какой-то причине это игнорирует настроенный уровень языка в файле ipr и по умолчанию составляет 1,6. Способ обойти это - предварительно настроить ipr и соответствующие файлы iml, чтобы он знал об интеграции Gradle. Таким образом, вам не будет предложено импортировать проект Gradle, а уровень языка останется на уровне 1.8. Блок кода выше был обновлен, чтобы включить необходимую конфигурацию.

Ответ 3

Он, похоже, не поддерживается, но это простое одноразовое исправление.

  • Перейдите к: Файл → Структура проекта Выберите "Модули" в разделе
  • Настройки проекта. (должно быть уже) Изменить "Уровень языка" до 7.0

В качестве альтернативы

  • Сверните и выполните ошибку компиляции в файле. Обычно это что-то вроде обработки нескольких ошибок в блоке catch.
  • Выберите красный значок помощника, который появляется, и "установите уровень языка 1,7"