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
не правильный способ проверить совместимость?
ОБНОВЛЕНИЕ: Да, это на самом деле сборка нескольких проектов, но я проверил только один из результатов сборки подпроектов. В файле сборки этого подпроекта я внес упомянутые изменения, чтобы убедиться, что они действительно применяются. Кроме того, я добавил следующее в файл сборки корневого проекта (как и @Vidya):
allprojects {
sourceCompatibility = 1.6
targetCompatibility = 1.6
}
Но это тоже не помогло.
ОБНОВЛЕНИЕ 2: я проверил настройку sourceCompatibility с этим фрагментом в соответствующих файлах build.gradle:
compileJava.doFirst {
println "source compatibility " + sourceCompatibility
}
Он показал, что моя sourceCompatibility установлена на 1.7, хотя я пытался установить его на 1.6. Когда я извлек простейший подпроект и встроил его самостоятельно, sourceCompatibility настроено правильно, а Java-байт-код совместим с 1.6. Однако даже этот подпроект использует неправильную sourceCompatibility при использовании в многопроектной сборке.
Кстати: плагины, которые я использую в некоторых из подпроектов: java
, war
, jetty
, gwt
ОБНОВЛЕНИЕ 3: я изменил встроенные сценарии, чтобы просто использовать плагин Java (и, следовательно, просто создать несколько JAR-файлов) и удалил использование war
, jetty
а также gwt
плагин. Но все же все проекты настроены на SourceCompatibility 1.7, несмотря на то, что я установил его в allprojects
раздел и в некоторых из подпроектов. Все, что осталось сейчас в сценариях сборки, - это объявление некоторых порядочностей (maven, файлы и другие подпроекты), объявление используемых репозиториев, объявление некоторых других задач (от которых задача сборки не зависит, так что это не должно быть затронуто) и конфигурацией файла манифеста для созданных jar-файлов (я добавляю спецификацию, версию и заголовок реализации в файл манифеста).
Я не понимаю, как это повлияет на настройку sourceCompatibility.
4 ответа
Кажется, это поведение вызвано указанием sourceCompatibility
до apply plugin: 'java'
, что происходит, если вы пытаетесь установить параметр совместимости внутри allprojects
,
В моей настройке ситуацию можно решить, заменив:
allprojects {
sourceCompatibility = 1.6
targetCompatibility = 1.6
}
с:
allprojects {
apply plugin: 'java'
sourceCompatibility = 1.6
targetCompatibility = 1.6
}
Будем рады, если кто-нибудь еще сможет проверить это в другой настройке.
Я все еще не уверен, следует ли сообщать об этом как об ошибке, но я считаю, что это решение лучше, чем обходной путь, упомянутый выше (что, однако, было очень полезно).
Симптомы указывают на то, что где-то кто-то перезаписывает project.sourceCompatibility
, Но, учитывая, что существует множество способов настройки Gradle, я не могу сказать на расстоянии, кто это.
В качестве обходного пути вы можете установить свойства на уровне задачи, что в конечном счете учитывается:
tasks.withType(JavaCompile) {
sourceCompatibility = "1.6"
targetCompatibility = "1.6"
}
Добавьте это к allProjects { ... }
блок.
Вам необходимо определить задачи compileJava в файле build.gradle, если вы используете sourceCompatibility или targetCompatibility. Без задач compileJava обе переменные совместимости отображаются в Intellij как неиспользуемые переменные. Я использую Gradle версии 2.10.
Чтобы решить эту проблему, просто проверьте сборку Gradle (приложение) и поместите в нее приведенный ниже код.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Также в сборке Gradle (проекте) у вас должен быть приведенный ниже код.
allprojects {
repositories {
google()
mavenCentral()
jcenter()
sourceCompatibility = 1.6
targetCompatibility = 1.6
}
}