Gradle Zip任务打包Java文件时如何保留指定目录结构?
解决Gradle Zip任务保留目录结构的问题
我来帮你搞定这个Zip打包目录结构的问题!你当前的任务之所以会把所有Java文件都放到zip根目录,是因为你使用fileTree时,默认会把指定的路径(比如core-module/src/mypackage/)作为文件的相对路径起点,所以里面的子目录和文件都会直接平铺到zip根目录。下面给你两种可行的解决方案:
方法一:从项目根目录开始匹配文件(推荐)
直接以项目根目录作为from的起点,通过include精确指定需要打包的文件路径,这样Gradle会自动保留完整的目录结构:
task apiJavaDocSources(type: Zip) { // 打包core-module下指定的Java文件,保留core-module/src/mypackage/...结构 from(project.rootDir) { include 'core-module/src/mypackage/subpackage/*Exception.java' include 'core-module/src/mypackage/subpackage/package-info.java' include 'core-module/src/mypackage/anotherpackage/*.java' } // 打包lib-module下指定的Java文件,保留lib-module/src/mypackage/...结构 from(project.rootDir) { include 'lib-module/src/mypackage/bundleinfo/*Dummy.java' include 'lib-module/src/mypackage/bundleinfo/Random.java' } archiveName 'api-javadoc-sources.zip' destinationDir(file('image')) }
这种方法的好处是配置简洁,直接通过完整路径匹配文件,不需要额外处理目录映射,打包后的结构完全和你本地项目的对应路径一致。
方法二:用into指定目标目录
如果你不想从项目根目录开始from,可以给每个from块添加into配置,明确指定这些文件在zip中的目标目录:
task apiJavaDocSources(type: Zip) { // 处理core-module的文件,将它们放到zip内的core-module/src/mypackage/目录下 from(fileTree('core-module/src/mypackage/').matching { include 'subpackage/*Exception.java' include 'subpackage/package-info.java' include 'anotherpackage/*.java' }) { into 'core-module/src/mypackage/' } // 处理lib-module的文件,将它们放到zip内的lib-module/src/mypackage/目录下 from(fileTree('lib-module/src/mypackage/').matching { include 'bundleinfo/*Dummy.java' include 'bundleinfo/Random.java' }) { into 'lib-module/src/mypackage/' } archiveName 'api-javadoc-sources.zip' destinationDir(file('image')) }
这里的into相当于给当前from块里的所有文件指定了一个"父目录",原来fileTree里的子目录(比如subpackage)就会嵌套到这个父目录下,从而实现你想要的结构。
两种方法都能达到你的需求,你可以根据自己的习惯选择。运行./gradlew apiJavaDocSources之后,生成的zip文件就会保留core-module和lib-module开头的完整目录结构了。
内容的提问来源于stack exchange,提问作者Swapnil Kotwal
相关产品推荐
相关产品推荐

