如何为Gradle项目创建可执行测试Jar包?
如何构建Gradle项目的可执行测试Jar包
我明白你的需求——想要一个能直接运行测试的Jar包,功能和gradlew clean :mymodule:test完全一致,但之前的packageTests任务只打包了测试类和资源,缺了主应用代码和依赖库对吧?别担心,咱们分两种方式来实现,选你顺手的就行:
方法一:用Shadow插件(推荐,简洁省心)
Shadow插件是Gradle生态里做Fat Jar最常用的工具,能帮你自动把所有依赖打包进去,不用手动处理复杂的依赖收集。
步骤1:添加Shadow插件到build.gradle
首先在你的模块build.gradle里引入插件:
plugins { id 'java' // 可替换为最新版本的Shadow插件 id 'com.github.johnrengelman.shadow' version '8.1.1' }
步骤2:配置Shadow任务生成测试可执行Jar
接着添加以下配置,指定要包含的内容和主类:
shadowJar { // 给Jar加后缀,方便区分普通Jar和测试可执行Jar classifier = 'test-executable' // 同时包含主应用代码和测试代码的编译输出 from sourceSets.main.output from sourceSets.test.output // 打包所有测试运行时需要的依赖(包括JUnit、主类依赖等) configurations = [project.configurations.testRuntimeClasspath] // 指定主类:用JUnit Platform的控制台启动器触发测试执行 manifest { attributes 'Main-Class': 'org.junit.platform.console.ConsoleLauncher' } }
步骤3:确保测试依赖包含JUnit控制台启动器
要让ConsoleLauncher正常工作,测试依赖里得加上它:
dependencies { // 常规JUnit 5依赖 testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.0' // 必须添加这个才能用控制台启动器运行测试 testRuntimeOnly 'org.junit.platform:junit-platform-console:1.10.0' }
运行方式
执行gradlew shadowJar,生成的Jar会在build/libs/目录下,比如mymodule-test-executable-1.0.jar。运行测试的命令:
java -jar build/libs/mymodule-test-executable-1.0.jar
如果要指定运行某个测试类或包,还可以加JUnit控制台参数:
# 运行指定测试类 java -jar build/libs/mymodule-test-executable-1.0.jar --select-class com.example.MyTestClass # 运行指定包下的所有测试 java -jar build/libs/mymodule-test-executable-1.0.jar --select-package com.example.tests
方法二:手动配置Fat Jar(不用插件)
如果你不想用第三方插件,也可以手动写Gradle任务来实现:
配置可执行测试Jar任务
在build.gradle里添加这个任务:
task executableTestJar(type: Jar) { classifier = 'test-executable' // 包含主应用和测试代码 from sourceSets.main.output from sourceSets.test.output // 解压并包含所有测试运行时依赖的Jar包 from { configurations.testRuntimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } // 同样指定JUnit控制台启动器为主类 manifest { attributes 'Main-Class': 'org.junit.platform.console.ConsoleLauncher' } // 确保任务执行前先编译测试类 dependsOn testClasses }
运行方式
执行gradlew executableTestJar生成Jar,之后的运行命令和Shadow插件的完全一样。
为什么之前的packageTests不行?
你之前的任务只打包了sourceSets.test.output,也就是测试类和测试资源,但测试类依赖主应用的代码,同时运行测试还需要JUnit等依赖库——这些都没包含进去,自然没法独立运行。咱们上面的配置就是补上了这两块内容,同时指定了能触发测试的主类,这样Jar就能独立运行测试了。
内容的提问来源于stack exchange,提问作者Ermintar




