You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java+Gradle+Selenium自动化项目:如何打包含main与test类的单JAR包

当然可以!Gradle完全支持打包单个包含main和test类的JAR

你遇到的情况是Gradle默认的jar任务只会打包src/main/java下的编译产物,测试代码的产物会被单独处理。要把两者合并到同一个JAR里,有两种简单的实现方式:

方法一:修改默认的jar任务

直接调整Gradle自带的jar任务,让它同时包含test源码集的编译输出。在你的build.gradle(以下以Groovy语法为例)里添加这段配置:

jar {
    // 加入test源码集的类文件和资源文件
    from sourceSets.test.output.classesDirs
    from sourceSets.test.output.resourcesDir

    // 可选:如果测试代码依赖第三方库,且需要把依赖也打包进JAR(生成可执行胖JAR),可以打开下面的注释
    // from configurations.testRuntimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}

配置完成后,运行./gradlew jar,build/libs目录下生成的JAR就会同时包含main和test的所有类了。

方法二:创建自定义合并JAR任务(推荐,不影响默认JAR)

如果你不想改动默认的jar任务,可以单独创建一个自定义任务来生成合并后的JAR,这样默认JAR和合并JAR可以共存:

task combinedTestJar(type: Jar) {
    // 给JAR加后缀方便区分,比如生成xxx-combined.jar
    archiveClassifier = 'combined'

    // 导入main和test的编译产物
    from sourceSets.main.output
    from sourceSets.test.output

    // 可选:打包依赖库生成胖JAR
    // from configurations.testRuntimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }

    // 可选:如果需要让JAR直接运行,指定测试代码的入口类
    // manifest {
    //     attributes 'Main-Class': 'com.yourpackage.YourTestEntryClass'
    // }

    // 确保任务执行前先完成test代码的编译
    dependsOn testClasses
}

执行./gradlew combinedTestJar后,build/libs下就会生成带-combined后缀的合并JAR。

小提醒

  • 如果你的测试代码依赖了testRuntime的第三方库,想要让合并后的JAR能直接运行,记得打开配置里的注释,把依赖库也打包进去(也就是生成胖JAR)。
  • 打包前无需手动编译测试代码,自定义任务里的dependsOn testClasses会自动帮你完成编译步骤。

内容的提问来源于stack exchange,提问作者jagannathan rajagopalan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:39:46