Maven打包jar运行报NoClassDefFoundError 已添加Hibernate依赖未生效
根因说明
- 默认
maven-jar-plugin仅会将项目自身的编译产物打入jar包,不会包含Hibernate、PostgreSQL驱动这类第三方依赖。你配置的<addClasspath>true只是在jar包的MANIFEST.MF文件中写入了依赖的文件名列表,不会把依赖本身打包到jar内,运行时如果对应依赖不在类路径下,就会抛出NoClassDefFoundError异常。 - 你当前pom中仅声明了编译期依赖,没有配置打包时合并第三方依赖的逻辑,因此直接运行打包产物会找不到类。
常见解决方案
不需要手动为每个依赖单独指定类路径,以下两种方案均可解决问题:
方案1:使用maven-assembly-plugin打可执行fat jar
该插件会将所有第三方依赖和项目自身代码合并到同一个jar包中,直接运行即可。需要将插件配置放到pom的<build><plugins>节点下(注意不要放在pluginManagement节点内,pluginManagement仅用于统一声明插件版本,不会触发插件执行):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>com.ziqi.App</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
配置完成后执行mvn clean package,target目录下会生成后缀为jar-with-dependencies的jar包,直接用java -jar 对应jar包名即可运行。
方案2:使用maven-shade-plugin打包
如果存在依赖冲突、资源文件合并等复杂需求,可以使用shade插件,配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.ziqi.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
执行打包命令后生成的jar包即可直接运行。
如果你不想把所有依赖打进同一个jar包,也可以将所有第三方依赖放到同一个lib目录下,运行时执行java -cp "你的jar包名:lib/*" com.ziqi.App即可,不需要逐个指定依赖名称。
内容的提问来源于stack exchange,提问作者Ziqi Liu
相关产品推荐
相关产品推荐

