У меня есть 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.