Gradle Zip任务:如何为各源文件单独指定压缩包内路径?
问题描述
项目文件布局
ROOT |-src | |- main | |- java | | \- [rest of java files] | |- scripts | \- run.bat |-build |-build.gradle |-settings.gradle
期望的压缩包布局
需要创建一个名为dist的Gradle任务,在dist文件夹下生成myproject.zip,压缩包内部结构如下:
ROOT | : |- dist \- myproject.zip |-lib | |-myapp.jar \-bin |-run.bat
当前的build.gradle代码
plugins { id 'java' } /* other tasks */ tasks.register('dist', Zip) { dependsOn('build') from "build/libs/myapp.jar" into "lib" from "src/main/scripts/run.bat" into "bin" // <<<<--- 此写法无效,会覆盖之前的lib目标路径 archiveName "myproject.zip" destinationDir(file('dist')) }
疑问
当前写法是否正确?看起来Zip任务只能设置一个into目标路径,但我需要为每个源文件单独指定压缩包内的目标路径,该如何实现需求?
解决方案
你的写法存在问题:into是全局配置,第二次调用into "bin"会覆盖之前的into "lib",最终所有文件都会被放到bin目录下。
要实现不同源文件对应不同压缩包内路径,需要将from和into配对使用,通过闭包嵌套配置来分别处理每组文件:
正确写法一
plugins { id 'java' } /* other tasks */ tasks.register('dist', Zip) { dependsOn('build') // 将myapp.jar放入压缩包的lib目录 from("build/libs/myapp.jar") { into "lib" } // 将run.bat放入压缩包的bin目录 from("src/main/scripts/run.bat") { into "bin" } archiveName "myproject.zip" destinationDir(file('dist')) }
正确写法二(按目标目录分组)
plugins { id 'java' } /* other tasks */ tasks.register('dist', Zip) { dependsOn('build') // 配置lib目录的源文件 into "lib" { from "build/libs/myapp.jar" } // 配置bin目录的源文件 into "bin" { from "src/main/scripts/run.bat" } archiveName "myproject.zip" destinationDir(file('dist')) }
原理说明
每个from或into方法都可以接收闭包,在闭包内的配置仅对当前组的源文件生效,不会互相干扰,以此实现为不同源文件指定独立的压缩包内路径。
内容的提问来源于stack exchange,提问作者bluearth
相关产品推荐
相关产品推荐

