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

Java Spark单元测试报Jersey类不存在但正式运行正常如何解决?

问题原因
  • 正式Spark任务运行时依赖集群内置的Spark runtime环境,本身已经包含Jersey 1相关依赖,且Spark UI由集群统一提供,业务包不需要自带该依赖,所以运行正常。
  • 单元测试使用local模式运行Spark,初始化JavaSparkContext时默认会启动本地Spark UI服务,UI的接口实现依赖Jersey 1的jersey-server包。你在全局配置中排除了该依赖,导致测试运行时类加载失败。
  • 注释全局排除规则后,Jersey 1会被打入业务包,和Dropwizard依赖的Jersey 2产生版本冲突,因此正式运行会报错。
解决方案

方案1(推荐):关闭单元测试的Spark UI

直接在测试用例的SparkConf中添加关闭UI的配置,完全避免Jersey 1依赖的加载,无需调整依赖规则:

@Before
public void setUp() throws IllegalArgumentException, IOException {
    SparkConf conf = new SparkConf();
    conf.setMaster("local[2]");
    conf.setAppName("sparkHelperTest");
    // 新增这行关闭UI,跳过Jersey相关逻辑
    conf.set("spark.ui.enabled", "false");
    sparkCtx = new JavaSparkContext(conf);
}

方案2:仅为测试范围引入Jersey 1依赖

如果需要在单元测试中保留Spark UI,可在build.gradle中仅为测试环境添加Jersey 1依赖,不会打入正式发布包,避免版本冲突:

// 仅测试范围依赖,不影响正式打包
testImplementation 'com.sun.jersey:jersey-server:1.19.4'

方案3:调整依赖排除范围

将全局Jersey排除规则改为仅针对正式运行的配置生效,测试配置不做排除:

// 替换原来的全局configurations.all排除规则
configurations {
    compileClasspath {
        exclude group: 'com.sun.jersey', module: 'jersey-server'
    }
    runtimeClasspath {
        exclude group: 'com.sun.jersey', module: 'jersey-server'
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:36:07