You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为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

火山引擎 最新活动