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

多模块Selenium自动化项目Gradle构建FatJar遇依赖缺失问题求助

解决Gradle多模块项目构建FatJar缺失依赖的问题

首先,我帮你梳理下当前遇到的核心问题:你在多模块项目的根Gradle脚本里构建FatJar,但打包后的Jar既没包含子模块的测试/业务代码,也没正确收集所有测试依赖,导致运行时找不到JUnit相关类。下面是具体的问题分析和修复方案:

问题根源

你的现有fatJar任务存在几个关键缺陷:

  1. 未包含子模块代码:from sourceSets.test.output只处理了根项目的测试输出,但你的测试代码、业务逻辑都在子模块里,根项目本身没有这些代码,所以Jar里根本没打包进LoginTests、LoginPage_Method这些类。
  2. 依赖收集不完整:configurations.testRuntime在多模块场景下无法正确拉取所有子模块的测试依赖,而且这个配置在新版Gradle里已被标记为废弃,应该用更全面的testRuntimeClasspath替代。
  3. 未处理重复文件:打包多个依赖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:57:47