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

