如何用Spring Boot Gradle插件及bootJar任务有条件排除Java文件?
解决Gradle Spring Boot打包时排除指定目录代码的问题
你的问题很典型——虽然sourceSets的exclude逻辑在打印路径时生效了,但bootJar任务并没有同步应用这个排除规则,导致dangerous目录下的文件还是被打包进了Jar。这是因为Spring Boot的bootJar任务(Gradle标准Jar任务的扩展)有时候不会完全继承sourceSets的配置,或者你的exclude逻辑的评估时机和打包任务的执行时机不匹配。
下面给你几个可行的解决方案:
方案一:直接在bootJar任务中配置排除规则
这是最直接有效的方式,因为bootJar是最终负责生成可执行Jar的任务,直接在它里面定义exclude规则能确保打包阶段生效:
plugins { id 'java' id 'org.springframework.boot' version '2.0.0.RELEASE' } // 先判断环境属性是否存在,避免未传-P参数时抛出异常 def isProductionEnv = project.hasProperty('environment') && project.environment == 'prod' // 配置bootJar的排除规则 bootJar { if (isProductionEnv) { exclude '**/dangerous/**' } } // 可选:如果需要让编译阶段也排除这些文件,保留sourceSets的配置 sourceSets { main { java { if (isProductionEnv) { exclude '**/dangerous/**' } // 验证路径的打印逻辑可以保留 srcDirs.each { dir -> fileTree(dir).include('**/*.java').each { file -> println file.absolutePath } } } } }
方案二:确保bootJar任务依赖sourceSets的输出
有时候bootJar可能会直接从源码目录读取文件,而不是使用sourceSets处理后的输出。这种情况下,显式指定bootJar的输入源为sourceSets的output就能解决问题:
plugins { id 'java' id 'org.springframework.boot' version '2.0.0.RELEASE' } def isProductionEnv = project.hasProperty('environment') && project.environment == 'prod' sourceSets { main { java { if (isProductionEnv) { exclude '**/dangerous/**' } srcDirs.each { dir -> fileTree(dir).include('**/*.java').each { file -> println file.absolutePath } } } } } // 让bootJar使用sourceSets处理后的编译输出 bootJar { from sourceSets.main.output }
验证方式
执行打包命令后,你可以通过以下方式确认排除是否生效:
- 查看Jar包内容:用解压工具打开生成的Jar,确认
dangerous目录不存在 - 查看打包日志:执行
gradlew bootJar --info,搜索exclude相关的日志,确认规则被正确应用
内容的提问来源于stack exchange,提问作者Zymus
相关产品推荐
相关产品推荐

