Java11打包Jar在Linux运行报ClassNotFoundException求助
排查
java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver问题 下面是几种常见的原因和解决方向:
依赖未被打包进Jar文件
本地IntelliJ运行时会自动加载项目依赖的Hive JDBC包,但默认的Maven/Gradle打包只会将你自己的代码打进Jar,不会包含第三方依赖。可以通过以下方式解决:- 用Maven的
maven-shade-plugin或Gradle的shadowJar插件,配置将所有依赖合并到一个可执行Jar中; - 如果不合并Jar,可将Hive JDBC及相关依赖Jar放在目标Jar同目录,用
java -cp "test.jar:hive-jdbc-*.jar:其他依赖.jar" 你的主类全路径命令运行。
- 用Maven的
依赖版本不匹配或缺失
确认本地开发使用的Hive JDBC依赖版本与Linux环境的Hive集群版本一致,比如Hive 3.x版本要对应hive-jdbc-3.x.x.jar,版本不兼容会导致类结构不匹配或缺失。同时检查依赖包是否完整,有没有遗漏Hive JDBC的传递依赖(比如Hadoop客户端、commons-logging等)。Jar的MANIFEST.MF配置错误
如果用java -jar运行,需检查MANIFEST.MF文件:Main-Class是否正确指定了你的主类全路径;Class-Path是否正确配置了依赖Jar的相对路径(如果依赖Jar和目标Jar同目录,可写hive-jdbc-xxx.jar,多个依赖用空格分隔)。若路径配置错误,JVM无法找到依赖类。
Linux环境类加载路径冲突
Linux系统的CLASSPATH环境变量可能包含了其他版本的Hive相关Jar,导致类加载冲突。可以在运行时加上-Djava.system.class.loader=sun.misc.Launcher$AppClassLoader强制使用应用类加载器,或者清空系统CLASSPATH后再运行Jar。
内容的提问来源于stack exchange,提问作者hong kun
相关产品推荐
相关产品推荐

