Gradle sourceCompatibility не влияет на подпроекты

У меня есть Java 6 и 7, установленные на моей машине. Gradle использует 1.7 (проверено с помощью gradle -v). Но мне нужно скомпилировать мой код для совместимости с Java 1.6. Насколько я понимаю документацию, я могу использовать свойство sourceCompatibility для этого (и косвенно targetCompatibility, который по умолчанию соответствует sourceCompatibility).

Итак, я добавил следующую строку в мой файл сборки (на корневом уровне, а не в любом закрытии):

sourceCompatibility = 1.6

(конечно, я также добавил targetCompatibility = 1.6 в некоторых тестах, но это не должно меняться)

Чтобы проверить, действительно ли результат был совместим с 1.6, я распаковал полученный банку cd в папку WEB-INF/classes и использовал javap -verbose в первом файле .class, с которым я столкнулся. Но независимо от того, устанавливаю ли я целевую совместимость или использовал ли я 1.5 вместо 1.6, или я указывал его как строку ('1.6'), каждый раз, когда результат javap был

minor version: 0
major version: 51

Afaik означает, что это Java 1.7 Bytecode, что неверно.

Любые идеи, почему настройка sourceCompatibility не работает? Или javap не правильный способ проверки совместимости?

UPDATE: Да, это на самом деле многопроектная сборка, но я только проверил один из результатов сборки подпроектов. В этом файле сборки подпроекта я сделал указанные изменения уверенными, что они действительно применяются. Кроме того, я добавил следующее в файл сборки корневого проекта (как предложил @Vidya):

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

Но это тоже не помогло.

ОБНОВЛЕНИЕ 2: Я проверил настройку sourceCompatibility с этим фрагментом в соответствующих файлах build.gradle:

compileJava.doFirst {
    println "source compatibility " + sourceCompatibility
}

Это показало, что моя исходная совместимость установлена ​​на 1.7, хотя я пытался установить ее в 1.6. Когда я извлек простейший подпроект и встроил его самостоятельно, sourceCompatibility устанавливается правильно, а код байт Java совместим с 1.6. Однако даже этот подпроект использует неверную исходную совместимость при использовании в многопроектной сборке.

BTW: плагины, которые я использую в некоторых из подпроектов: java, war, jetty, gwt

ОБНОВЛЕНИЕ 3: Я изменил построенные скрипты, чтобы просто использовать java-плагин (и, таким образом, просто создать несколько банок) и удалить использование плагинов war, jetty и gwt. Но все же все проекты установлены на исходную совместимость 1.7, несмотря на то, что я устанавливаю ее в разделе allprojects и в некоторых из подпроектов. Все, что осталось в скриптах сборки, - это объявление некоторых приемов (maven, файлов и других подпроектов), объявление репозиториев, объявление некоторых других задач (что задача build не зависит от, поэтому он не должен быть затронут) и конфигурацию файла манифеста для созданных файлов jar (я добавляю спецификацию и версию реализации и заголовок в файл манифеста).

Я не вижу, как это повлияет на параметр sourceCompatibility.

Ответ 1

Кажется, это поведение вызвано указанием sourceCompatibility до apply plugin: 'java', которое происходит, если вы попытаетесь установить параметр совместимости внутри allprojects.

В моей настройке ситуацию можно решить, заменив:

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

с:

allprojects {
    apply plugin: 'java'
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

Будет рад, если кто-то еще сможет проверить это в другой настройке.

Я все еще не уверен, следует ли это сообщать об ошибке, но я считаю, что это решение лучше, чем описанная выше работа (что было очень полезно).

Ответ 2

Симптомы показывают, что где-то кто-то перезаписывает project.sourceCompatibility. Но учитывая, что существует множество способов настройки Gradle, я не могу сказать с расстояния, кто это.

В качестве обходного пути вы можете установить свойства на уровне задачи, что в конечном счете считается:

tasks.withType(JavaCompile) { 
    sourceCompatibility = "1.6"
    targetCompatibility = "1.6" 
}

Добавьте это в блок allProjects { ... }.

Ответ 3

Вам нужно определить задачи compileJava в файле build.gradle, если вы используете sourceCompatibility или targetCompatibility. Без задач compileJava обе переменные совместимости отображаются как неиспользуемые переменные в Intellij. Я использую Gradle версию 2.10.