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
    }
}
Другие вопросы по тегам