build.gradle中哪个表达式可获取Gradle默认jar任务打包的文件列表?
在不修改任何Jar任务默认配置的场景下,build.gradle中可通过以下表达式直接获取实际会被打包进归档的文件集合:
- Groovy DSL:
jar.source - Kotlin DSL:
tasks.jar.get().source
该表达式返回的是Jar任务当前配置的全部源文件树,和最终生成的Jar包内的文件列表完全一一对应,不存在配置和实际归档内容不一致的情况。
源码定位误区说明
在两个Jar类源码中找不到对应文件绑定逻辑的原因是:源文件的默认关联配置逻辑并不在Jar任务类本身的实现中。org.gradle.api.tasks.bundling.Jar和后续版本的org.gradle.jvm.tasks.Jar只负责实现文件打包归档的通用能力,不会硬编码指定需要打包的文件路径。
实际的默认绑定逻辑位于Gradle Java插件的初始化流程中:Java插件应用时,会自动将主sourceSet(
sourceSets.main)的输出目录绑定到默认jar任务的source属性上,这部分逻辑写在Java插件的任务装配代码里,而非Jar任务类的源码中。
自定义sourceSet未进入默认Jar的根因
由于Java插件的默认装配逻辑只关联了sourceSets.main.output,自定义创建的sourceSet不会被自动纳入jar任务的源文件范围,因此其包含的源码编译结果、资源文件都不会出现在默认生成的Jar归档中。如果需要纳入自定义sourceSet的内容,仅需在build.gradle中执行一次手动绑定即可,例如:
// 将自定义sourceSet的输出加入默认Jar的打包源 jar.from sourceSets.myCustomSource.output
验证用辅助任务示例
可在build.gradle中添加如下打印任务,直接输出Jar任务将打包的全部文件路径:
tasks.register("showJarContents") { doLast { println "Jar归档打包文件明细:" jar.source.visit { detail -> // 过滤掉目录条目,只打印实际文件 if (!detail.isDirectory) { println " * ${detail.relativePath}" } } } }
执行gradle showJarContents即可看到完整的文件列表,结果和打开最终Jar包看到的文件内容完全一致。
内容的提问来源于stack exchange,提问作者czerny

