Java 11打包Jar在Linux运行时遇ClassNotFoundException求助
问题排查与解决
1. 先确认Jar包是否包含Hive驱动类
在Linux上执行jar tf test.jar,搜索org/apache/hive/jdbc/HiveDriver.class,如果查不到,说明第三方依赖没被打进Jar里——这是最常见的原因:IntelliJ运行时会自动加载项目依赖库,但默认打包Jar不会包含这些外部依赖。
2. 调整打包方式,把依赖包含进去
用Maven的话,配置shade插件打Fat Jar
在pom.xml里加这段配置,替换成你的主类全路径:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourpackage.YourMainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn package后,target目录下会生成带-shaded后缀的Jar,用这个Jar运行就不会缺依赖了。
用Gradle的话,用shadow插件
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' } shadowJar { mergeServiceFiles() mainClassName = 'com.yourpackage.YourMainClass' }
执行gradle shadowJar生成包含所有依赖的Jar包。
3. 不想打Fat Jar?运行时指定类路径
把hive-jdbc相关依赖Jar放到服务器的./lib目录,然后用以下命令运行(替换主类路径):
java -cp test.jar:./lib/* com.yourpackage.YourMainClass
如果非要用-jar参数,得在Jar的Manifest文件里配置Class-Path,列出所有依赖Jar的绝对路径或相对路径,确保和服务器上的位置对应。
4. 检查依赖版本是否一致
确认IntelliJ里用的hive-jdbc版本和pom/gradle里配置的版本完全一致,避免版本不匹配导致类找不到。比如pom里的依赖要正确引入:
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>3.1.2</version> <!-- 替换成你的实际版本 --> </dependency>
注意hive-jdbc还依赖hive-service、hadoop-common等包,这些也要确保被正确引入。
关于Class.forName的说明
Java 6之后JDBC驱动会自动注册,但你写了Class.forName,本质还是类路径问题——只要依赖能被加载到,这条语句就能正常执行,不用改代码。
内容的提问来源于stack exchange,提问作者hognkun
相关产品推荐
相关产品推荐

