多模块Selenium自动化项目Gradle构建FatJar遇依赖缺失问题求助
解决Gradle多模块项目构建FatJar缺失依赖的问题
首先,我帮你梳理下当前遇到的核心问题:你在多模块项目的根Gradle脚本里构建FatJar,但打包后的Jar既没包含子模块的测试/业务代码,也没正确收集所有测试依赖,导致运行时找不到JUnit相关类。下面是具体的问题分析和修复方案:
问题根源
你的现有fatJar任务存在几个关键缺陷:
- 未包含子模块代码:
from sourceSets.test.output只处理了根项目的测试输出,但你的测试代码、业务逻辑都在子模块里,根项目本身没有这些代码,所以Jar里根本没打包进LoginTests、LoginPage_Method这些类。 - 依赖收集不完整:
configurations.testRuntime在多模块场景下无法正确拉取所有子模块的测试依赖,而且这个配置在新版Gradle里已被标记为废弃,应该用更全面的testRuntimeClasspath替代。 - 未处理重复文件:打包多个依赖Jar时,很容易出现重复的META-INF文件或类,会导致打包失败或运行异常。
修复方案
第一步:确保根项目关联所有子模块
在根项目的settings.gradle(没有的话直接新建)里添加子模块声明:
include 'api', 'pageobjects', 'testclasses'
第二步:修改根项目的fatJar任务
替换你现有的fatJar任务为以下代码:
task fatJar(type: Jar) { archiveBaseName = project.jar_name zip64 = true manifest { // 替换成你的测试启动类全类名 // 若没有自定义启动类,可直接用JUnit官方启动类:org.junit.runner.JUnitCore attributes 'Main-Class': 'com.automation.testclasses.TestRunner' } // 打包所有子模块的main和test代码输出 subprojects.each { subproject -> from subproject.sourceSets.main.output from subproject.sourceSets.test.output } // 收集所有测试运行时依赖(包含子模块的所有依赖) from { configurations.testRuntimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } // 排除重复文件,避免打包冲突 duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
第三步:添加自定义测试启动类(可选但推荐)
如果你的测试类没有main方法,直接用JUnitCore作为主类的话,运行Jar时需要手动指定测试类名(比如java -jar yourJar.jar com.automation.testclasses.LoginTests)。更便捷的方式是写一个自定义启动类,自动运行你的测试:
在testclasses模块的src/test/java/com/automation/testclasses/下新建TestRunner.java:
package com.automation.testclasses; import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { // 指定要运行的测试类 Result result = JUnitCore.runClasses(LoginTests.class); // 打印测试结果 for (Failure failure : result.getFailures()) { System.err.println("测试失败: " + failure.toString()); } System.out.println("测试完成,是否全部通过: " + result.wasSuccessful()); // 根据测试结果设置退出码,方便CI/CD流程判断 System.exit(result.wasSuccessful() ? 0 : 1); } }
第四步:构建并运行FatJar
执行构建命令:
./gradlew fatJar
构建完成后,在根项目的build/libs/目录下找到生成的Jar包,运行:
java -jar {nameofJar}.jar
这样就能解决你遇到的NoClassDefFoundError问题,Jar包里会包含所有子模块的代码和测试依赖,正常运行测试。
内容的提问来源于stack exchange,提问作者frass
相关产品推荐
相关产品推荐

