Gradle复制编译测试类子集异常:仅编译指定包,求正确实现方式
解决Gradle打包指定测试类Jar时误修改编译范围的问题
你的问题出在直接修改了compileTestJava任务的配置,而不是从它的输出结果里筛选内容。当你在from后面写compileTestJava { include ... }时,这相当于给compileTestJava任务添加了编译规则,导致它只编译org.example.samples包下的类,完全偏离了你的初衷。
下面是修正后的方案,既能让compileTestJava正常编译所有测试类,又能从中筛选指定包的类打包成Jar:
修正后的build.gradle代码
plugins { id 'java' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { // Gradle 4.10+推荐用testImplementation替代旧的testCompile testImplementation 'junit:junit:4.12' } // 定义打包指定测试类的Jar任务 task testSampleJar(type: Jar) { archiveName "sample.jar" // 从已编译的所有测试类目录中,筛选出目标包的类 from sourceSets.test.output.classesDirs { include "org/example/samples/**" } // 如果需要打包对应包的测试资源文件,取消下面注释 // from sourceSets.test.resources { // include "org/example/samples/**" // } } // 确保打包任务在所有测试类编译完成后执行 testSampleJar.dependsOn compileTestJava // 如果需要在执行test任务前先完成打包,保留这部分 test { dependsOn(testSampleJar) }
关键修改说明
- 替换任务类型:把
Zip换成Jar,因为我们的目标是生成Jar包,Gradle的Jar类型任务会自动处理Jar的格式要求,比通用的Zip更合适。 - 正确引用编译输出:通过
sourceSets.test.output.classesDirs获取compileTestJava任务的全部输出目录,然后在这个基础上用include筛选指定包的类——这样不会修改compileTestJava的编译范围,它依然会编译所有测试类。 - 明确依赖关系:添加
testSampleJar.dependsOn compileTestJava,确保打包任务只会在所有测试类编译完成后才执行,避免打包空内容或者未编译的类。
为什么原来的写法会出错?
你原来的代码from compileTestJava { include "org/example/samples/**" },本质是在配置compileTestJava任务:给它的编译规则添加了include过滤,导致这个任务只编译org.example.samples下的类。这相当于直接修改了编译任务的行为,而不是从它的输出里筛选内容。
内容的提问来源于stack exchange,提问作者Uri Simchoni
相关产品推荐
相关产品推荐

