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
相关产品推荐
相关产品推荐

