У меня есть проект библиотеки Java с открытым исходным кодом , для которого я хотел бы, чтобы встроенный артефакт как можно дольше поддерживал совместимость с Java 8.
Я недавно получил запрос , чтобы добавить файл module-info.java
и настроить поддержку Gradle для Java 9+. Между этим PR и документацией Gradle я переработал соответствующую часть build.gradle
, чтобы она выглядела так:
sourceCompatibility = 1.9
targetCompatibility = 1.8
ext.moduleName = 'vault.java.driver'
compileJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
]
classpath = files()
}
}
compileTestJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'junit',
'--add-reads', "$moduleName=junit",
'--patch-module', "$moduleName=" + files(sourceSets.test.java.srcDirs).asPath,
]
classpath = files()
}
}
Это замечательно, но я заметил серьезную путаницу между Грэдлом и IntelliJ.
Когда я импортирую проект в IntelliJ, он делает это чисто, и структура проекта четко показывает «Уровень языка» 9. IntelliJ, кажется, прекрасно понимает мой build.gradle
, так как он временно изменяет уровень языка на 8, когда я временно установите sourceCompatibility=1.8
и обновите.
Однако, когда я нажимаю «Build Project» из выпадающего меню «Build», я получаю ошибку:
Error:(1, 1) java: modules are not supported in -source 8
(use -source 9 or higher to enable modules)
Между тем, когда я пытаюсь обойти IntelliJ и запустить ./gradlew build
из командной строки, Gradle, похоже, не понимает мои настройки sourceCompatibility
или targetCompatability
:
* What went wrong:
Execution failed for task ':compileJava'.
> invalid source release: 1.9
Я действительно запутался. Как создать файл build.gradle
, который одновременно:
- позволяет для Java 9 +,
- при сохранении совместимости встроенных артефактов с Java 8 и
- радует и Gradle, и IntelliJ?