Gradle worker 收到的 name 变成 null:把名称作为参数值传递
任务里的 Named 对象有名称,经过 classloader 隔离后却丢了 name。对只需要名称的工作,传 ListProperty<String> 快照可避开复杂对象重建。
Gradle 任务中遍历 NamedDomainObjectContainer 能打印 asdf,把其中对象放进 WorkParameters 并提交到隔离 worker 后,同一个 getName() 却返回 null。Gradle 9.7.0-rc-3 的具体复现涉及容器注入的名称与 classLoaderIsolation 之间的边界,不应靠忽略 Kotlin 的非空提示来继续运行。
任务容器管理的对象,可能依赖创建它的模型上下文。worker 收到的是隔离参数,不应把“任务里这个 getter 正常”视作“任意复杂对象跨隔离后仍完整”的保证。这里尚不能据一项复现认定所有 Named 或所有稳定版都存在相同问题。
只需要名称时,传明确的字符串快照
如果工作单元只用名称,改成普通参数值可以缩小边界。下面展示参数与工作类,需使用相应 Gradle imports:
interface NameParameters : WorkParameters {
val names: ListProperty<String>
}
abstract class PrintNames : WorkAction<NameParameters> {
override fun execute() {
println(parameters.names.get().joinToString())
}
}
需要导入 org.gradle.workers.WorkParameters、WorkAction 与 org.gradle.api.provider.ListProperty。在原任务的执行方法中,先取出名称,再提交:
val nameSnapshot = myNDOC.map { it.name }
workerExecutor.classLoaderIsolation {
}.submit(PrintNames::class.java) {
names.set(nameSnapshot)
}
这里沿用已有任务的 myNDOC 和 workerExecutor;快照只复制名称,不包含原对象的其他属性。如果 worker 还需要文件、选项或关联值,应分别建模成受支持的参数并验证,不能丢掉字段后只以打印成功验收。
保留隔离与输入声明
不必为了拿到名称直接关闭 classloader 隔离。隔离可能是插件依赖或静态状态安全的必要条件,切换 noIsolation 会改变执行环境。也不要把任务引用本身交给 worker,再在工作线程里回读项目模型。
任务端仍需正确声明对构建结果有影响的输入。改成字符串参数不等于输入就自动参与任务缓存;若排序无关,应按业务约定规范顺序,若顺序有含义则原样保留。
验收比较任务快照与 worker 实际参数,覆盖多个名称、空集合和重复项的预期处理,并检查真正输出。后续 Gradle 版本应回到原来的复杂参数形状单独验证,不能用简化参数成功推断原对象序列化缺陷已经修复。


