Scala Spark项目打包可运行Jar时Redis类缺失致ClassNotFound异常求助
解决Scala Spark项目打包Jar时Redis类缺失的问题
这种本地跑顺风顺水、一打包就丢类的情况真的太闹心了,尤其是偏偏只有Redis相关的类没进Jar包——咱们一步步拆解问题,大概率是依赖配置或者打包规则的锅:
1. 先查依赖的引入方式
你提到是从Scala-Redis GitHub项目生成类后引入的,这里要注意两种常见的“坑”:
- 如果是手动下载Jar包放进项目lib目录:Eclipse会自动识别这些Jar让你编译运行,但你的构建工具(sbt/maven)未必会把它们纳入打包范围。得在构建配置里明确声明这个本地依赖,比如sbt里要加:
libraryDependencies += "com.github.etaty" % "scala-redis" % "2.10" from "file:///path/to/your/local/scala-redis.jar" - 如果是直接把Scala-Redis的源码复制到项目里:要确认这些源码文件夹被标记为「源文件目录」——Eclipse里右键文件夹→
Build Path→Use as Source Folder,同时还要在构建工具里把这个目录加入源路径(比如sbt里配置unmanagedSourceDirectories),不然打包工具会忽略这些代码。
2. 排查构建工具的打包规则
假设你用的是Spark项目常用的sbt-assembly插件,有可能是自定义的合并策略把Redis类排除了:
- 打开
build.sbt或assembly.sbt里的assembly配置,看看有没有类似这样的规则:
如果Redis相关的配置文件或类有冲突,可能需要调整策略确保Redis类被保留;另外要确认没有显式排除scala-redis相关的包路径。assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }
3. 同步Eclipse与构建工具的配置
有时候Eclipse的本地配置和sbt/maven的配置会“脱节”:
- 如果你用
sbt-eclipse生成的Eclipse项目,先执行sbt eclipse重新生成配置,确保Eclipse的依赖和sbt完全一致; - 手动清理Eclipse缓存:
Project→Clean,然后重新构建项目,再尝试打包。
4. 验证Jar包的实际内容
打包完成后,用命令jar tf your-project.jar查看Jar里的文件列表,搜索Redis相关的类(比如com.redis.Redis):
- 如果没找到,回到前面的步骤检查依赖配置;
- 如果找到了,那可能是运行时类路径的问题,但你说其他外部Jar都正常,这种情况概率很低,可以确认运行命令里有没有正确指定Jar包。
5. 换用官方仓库依赖更靠谱
其实scala-redis已经在Maven中央仓库有现成的依赖了,完全不用手动从GitHub生成类——直接在构建配置里引入官方依赖,能避免很多手动处理的问题:
- sbt(替换成你的Scala版本):
libraryDependencies += "com.github.etaty" %% "scala-redis" % "2.10" - maven(替换成你的Scala版本):
<dependency> <groupId>com.github.etaty</groupId> <artifactId>scala-redis_2.12</artifactId> <version>2.10</version> </dependency>
总结下来,最可能的原因就是你手动引入的Redis类没有被构建工具正确识别为依赖,导致打包时被遗漏了。先从依赖配置查起,再验证Jar内容,应该就能解决问题。
内容的提问来源于stack exchange,提问作者jAi
相关产品推荐
相关产品推荐

