Gradle中compileJava与tasks.withType(JavaCompile)的差异解析
为什么直接配置compileJava任务不生效,而tasks.withType(JavaCompile)可以?
两者的核心差异在于作用范围不同:
compileJava是Gradle默认的主代码编译任务,直接配置它只会对这单个任务生效。如果你的项目里存在其他Java编译任务(比如测试代码的testCompileJava、子项目的compileJava,或是插件生成的额外编译任务),这些任务不会继承你给compileJava设置的--add-exports参数,一旦这些任务涉及到sun.security.x509这类内部类的编译,就会触发失败。tasks.withType(JavaCompile)是对所有类型为JavaCompile的任务统一应用配置。不管是默认的主代码编译、测试代码编译,还是子项目里的编译任务,甚至是插件动态创建的编译任务,都会被设置--add-exports参数,确保所有需要编译的代码都能获取到模块访问权限,因此编译可以正常通过。
另外补充一个注意点:直接给options.compilerArgs赋值会覆盖Gradle默认的编译器参数,如果你需要保留原有参数,建议用add方法而非直接赋值,示例如下:
tasks.withType(JavaCompile) { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 options.compilerArgs.add('--add-exports=java.base/sun.security.x509=ALL-UNNAMED') }
这样既添加了需要的参数,又不会丢失Gradle默认配置的其他编译参数,配置更稳妥。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

