Java 如何设置targetCompatibility=1.8、sourceCompatibility=1.9或更高版本的IntelliJ/Gradle项目?

Java 如何设置targetCompatibility=1.8、sourceCompatibility=1.9或更高版本的IntelliJ/Gradle项目?,java,gradle,intellij-idea,Java,Gradle,Intellij Idea,我有一个例子,我希望构建的工件尽可能长时间地保持与Java8的兼容性 我最近收到了一封邮件,添加了模块info.java文件,并为Java9+支持设置了Gradle。在PR和之间,我重新处理了build.gradle的相关部分,使其看起来像这样: sourceCompatibility=1.9 targetCompatibility=1.8 ext.moduleName='vault.java.driver' 内贾瓦{ 属性(“moduleName”,moduleName) 首先{ option

我有一个例子,我希望构建的工件尽可能长时间地保持与Java8的兼容性

我最近收到了一封邮件,添加了
模块info.java
文件,并为Java9+支持设置了Gradle。在PR和之间,我重新处理了
build.gradle
的相关部分,使其看起来像这样:

sourceCompatibility=1.9
targetCompatibility=1.8
ext.moduleName='vault.java.driver'
内贾瓦{
属性(“moduleName”,moduleName)
首先{
options.compilerArgs=[
“--模块路径”,classpath.asPath,
]
类路径=文件()
}
}
编译测试Java{
属性(“moduleName”,moduleName)
首先{
options.compilerArgs=[
“--模块路径”,classpath.asPath,
“--添加模块”、“junit”,
“--add reads',“$moduleName=junit”,
“--patch module',“$moduleName=“+文件(sourceset.test.java.srcDirs).asPath,
]
类路径=文件()
}
}
这很好,但我注意到Gradle和IntelliJ之间有一些严重的混淆

当我在IntelliJ中导入项目时,它会非常干净,项目结构清楚地显示“语言级别”9。IntelliJ似乎很理解我的
build.gradle
,因为当我临时设置
sourceCompatibility=1.8
并刷新时,它将语言级别更改为8

但是,当我从“构建”下拉菜单中单击“构建项目”时,我得到错误:

Error:(1, 1) java: modules are not supported in -source 8
  (use -source 9 or higher to enable modules)
同时,当我试图绕过IntelliJ并从命令行运行
/gradlew build
时,Gradle似乎不理解我的
源兼容性
目标兼容性
设置:

* What went wrong:
Execution failed for task ':compileJava'.
> invalid source release: 1.9
我真的很困惑。如何创建一个
build.gradle
文件,该文件包括:

  • 允许使用Java 9+
  • 同时仍然保持与Java8的内置工件兼容性,以及
  • 让Gradle和IntelliJ都开心

注意:将我的Gradle包装器从4.10升级到5.4没有效果。您可以使用flag。可能也有帮助(尚未完全阅读),这似乎是为了响应而编写的。
java:modules不受-source 8支持
在针对1.8源代码进行编译时不能使用module info,请参阅检查此线程:启用设置(macOS上的首选项)|构建、执行,部署|构建工具| Gradle | Runner |将IDE构建/运行操作委托给Gradle选项,以在IDE和Gradle中获得相同的结果。@Andrey:嗯。。。但正是出于这个原因,我将“SourceCompatibility”设置为1.9。只有“targetCompatibility”设置为1.8(因为我希望构建的工件保持Java8向后兼容性)。为什么Gradle或IntelliJ会引用“TargetCompatibility”而不是“SourceCompatibility”?