Gradle配置exclude后仍无法排除指定类文件问题咨询
问题排查:Gradle exclude语句未过滤
abc/object/MyTestConfig*.class的原因 我看了你的Gradle配置,这几个点大概率是问题所在:
1. exclude规则加错了目录
你在from ("$projectDir/src/main/java/")块里写了排除MyTestConfig*.class的规则,但src/main/java是源码目录,本身不会生成.class文件——Java编译后的class文件默认存在build/classes/java/main目录下。这个规则完全没命中实际要排除的文件位置,自然起不到作用。
2. 未对项目编译产物设置exclude
你的jar任务里,第一个from处理的是依赖包,第二个from只打包了源码目录里的xml和MF文件,但没处理项目自身编译生成的class文件。这意味着编译后的MyTestConfig*.class是通过Gradle默认的jar打包逻辑被加进去的,而你根本没给这部分设置过滤规则。
3. 其他潜在原因
- 检查是否有自定义的Gradle任务(比如额外的copy、jar任务)把这些class文件追加到了最终jar包中;
- 确认
configurations.compile里的依赖包是否包含MyTestConfig*.class——如果是依赖带进来的,你需要在第一个处理依赖的from块里也加上对应的exclude规则; - 不用管
filterVersionConstants任务里的exclude,它只处理VersionConstants.tmpl文件,和jar打包完全无关。
修复建议
修改你的jar任务,把项目编译后的class目录纳入打包范围,并在对应的块里设置exclude:
jar { zip64 true // 处理依赖包 from((configurations.compile - configurations.jarDepends).collect { it.isDirectory() ? it : zipTree(it) }) { exclude "META-INF/*.SF" exclude "META-INF/*.DSA" exclude "META-INF/*.RSA" // 如果依赖包里也有MyTestConfig*.class,打开下面这行 // exclude "abc/object/MyTestConfig*.class" } // 处理项目自身编译生成的class文件,这里加exclude规则 from sourceSets.main.output { exclude "abc/object/MyTestConfig*.class" } // 处理源码目录里的xml和MF文件(这里不需要exclude class,因为本来就没有) from ("$projectDir/src/main/java/") { include "**/*.hbm.xml", "abc/tools/xml/XMLClasses.MF" } }
这样就能精准排除你不想打包的MyTestConfig*.class文件了。
内容的提问来源于stack exchange,提问作者Swapnil Kotwal
相关产品推荐
相关产品推荐

