Gradle 7.2自定义Jar任务时archiveFile属性配置报错问题求助
我之前也踩过Gradle 7.x版本里Jar任务的这类配置坑,正好能帮你搞定这两个报错:
先拆解报错原因
第一个报错(archiveFile未配置):Gradle 7.x开始,
archiveFile是个只读属性,它由archiveBaseName、archiveVersion、destinationDirectory等属性自动计算生成,不能手动直接配置。你之前的任务没设置这些基础归档属性,导致Gradle没法自动算出archiveFile的路径,所以抛出了未配置的错误。第二个报错(archiveFile是只读属性):这个更直接——
archiveFile本身就是只读的,你直接给它赋值肯定会失败,这是Gradle 7.x对任务属性做的约束调整。
正确的配置方案
下面给你两种符合Gradle 7.x规范的配置方式,选一种适合你的就行:
方案1:用标准归档属性配置(推荐)
通过设置archiveBaseName(Jar包基础名称)、archiveVersion(版本号)等属性,让Gradle自动管理archiveFile的路径:
task customJar(type: Jar) { manifest { attributes 'Implementation-Title': 'Gradle Jar File Example', 'Main-Class': 'xxx.aaa.Bbb' } // 设置Jar包的基础名称 archiveBaseName.set('custom-jar') // 如果不需要版本号,直接设为空字符串即可 archiveVersion.set('') // 打包folder目录下的所有内容 from 'folder' }
执行./gradlew customJar后,Jar包会默认生成在build/libs/custom-jar.jar目录下。
方案2:完全自定义Jar包的路径和名称
如果需要指定Jar包的输出目录和完整文件名,可以配置destinationDirectory和archiveFileName:
task customJar(type: Jar) { manifest { attributes 'Implementation-Title': 'Gradle Jar File Example', 'Main-Class': 'xxx.aaa.Bbb' } // 自定义Jar包的文件名 archiveFileName.set('my-custom.jar') // 自定义Jar包的输出目录(比如项目根目录下的output文件夹) destinationDirectory.set(file("$projectDir/output")) from 'folder' }
为什么之前设置baseName没生效?
你提到尝试过设置baseName但没解决,大概率是因为Gradle 7.x里这些属性已经变成了Property类型,需要用.set()方法赋值,而不是旧版本的直接赋值语法(比如archiveBaseName = 'xxx')。换成.set()的写法就能正常生效了。
执行完配置后,你可以打开生成的Jar包验证,里面应该会包含folder目录下的file.txt和other.txt文件。
内容的提问来源于stack exchange,提问作者Jmini

