Gradle Kotlin DSL下Java11项目sun.rmi.registry包编译错误如何解决
问题根因
你当前在编译参数中仅配置了java.rmi/sun.rmi.server和jdk.management.agent/jdk.internal.agent两个包的导出权限,但代码中引用的是java.rmi模块下的sun.rmi.registry包,没有在编译参数中声明该包对未命名模块的导出权限,因此触发编译错误。
配置调整方案
修改build.gradle.kts中JavaCompile任务的编译参数,新增sun.rmi.registry包的导出规则即可,调整后的相关配置如下:
tasks.withType<JavaCompile> { val compilerArgs = options.compilerArgs compilerArgs.addAll( listOf( "--add-exports", "java.rmi/sun.rmi.server=ALL-UNNAMED", "--add-exports", "java.rmi/sun.rmi.registry=ALL-UNNAMED", // 新增对应包的导出配置 "--add-exports", "jdk.management.agent/jdk.internal.agent=ALL-UNNAMED" ) ) }
额外注意事项
如果运行代码、执行单元测试时也用到了这些JDK内部API,需要同步给对应任务添加JVM启动参数,避免运行时报错,配置示例如下:
// 单元测试任务添加JVM参数 tasks.withType<Test> { jvmArgs.addAll( listOf( "--add-exports", "java.rmi/sun.rmi.server=ALL-UNNAMED", "--add-exports", "java.rmi/sun.rmi.registry=ALL-UNNAMED", "--add-exports", "jdk.management.agent/jdk.internal.agent=ALL-UNNAMED" ) ) } // 如果是可执行应用,run任务也需要添加对应参数 tasks.named<JavaExec>("run") { jvmArgs.addAll( listOf( "--add-exports", "java.rmi/sun.rmi.server=ALL-UNNAMED", "--add-exports", "java.rmi/sun.rmi.registry=ALL-UNNAMED", "--add-exports", "jdk.management.agent/jdk.internal.agent=ALL-UNNAMED" ) ) }
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

