You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle自定义PathingWar任务无法写入MANIFEST.MF的Class-Path属性如何解决

自定义Gradle PathingWar任务Manifest不生效解决方案

问题根源

你自定义的PathingWar类继承自Gradle内置的War任务,War本身已经包含了负责打包生成WAR文件的内置@TaskAction逻辑。你新增的@TaskAction注解的方法默认执行顺序在父类的打包动作之后,此时WAR包已经写入磁盘,Manifest的修改不会再同步到已生成的压缩包中。
原本构建脚本中使用doFirst可以生效,是因为doFirst注册的逻辑会插入到任务所有内置动作执行之前,在打包前修改Manifest可以被正确写入最终产物。

正确实现方式

不需要新增自定义@TaskAction方法,直接在自定义任务的构造函数中注册doFirst逻辑即可,完整代码如下:

import org.gradle.api.tasks.War
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.SourceSetContainer

class PathingWar extends War {

    PathingWar() {
        // 配置包名后缀
        getArchiveAppendix().set("pathing")
        // 注册打包前执行的Manifest修改逻辑
        doFirst {
            SourceSet mainSourceSet = ((SourceSetContainer) getProject().getExtensions().getByName("sourceSets"))
                    .getByName("main")
            def classpathStr = mainSourceSet.getRuntimeClasspath().getFiles()
                    .collect { project.uri(it) }
                    .join(" ")
            manifest {
                attributes("Class-Path": classpathStr)
            }
        }
    }
}

注意事项

不要将Manifest配置逻辑直接写在构造函数中,构造函数执行处于Gradle配置阶段,此时sourceSets的runtimeClasspath还未完全解析,会拿到不正确的类路径值,放到doFirst中会在任务执行前才解析类路径,保证取值正确。

内容的提问来源于stack exchange,提问作者RenatoIvancic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:45:03