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
相关产品推荐
相关产品推荐

