为何无法从控制台运行Hibernate Maven应用程序?
问题原因分析
你遇到的java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration本质是运行时缺少依赖类:
- NetBeans IDE运行时会自动把你pom.xml中声明的所有依赖(比如hibernate-core、h2数据库驱动)加入到类路径里,所以能正常加载Hibernate的Configuration类;
- 而你用
maven-jar-plugin打包出来的JAR,只包含你自己项目的代码,完全不包含任何外部依赖包。当你用java -jar直接运行这个JAR时,JVM找不到Hibernate等第三方类,就会抛出这个错误。
解决方案
下面提供两种常用的解决方式,选一种适合你的即可:
方式1:用Maven插件直接运行(无需手动打包)
你已经在pom.xml里配置了exec-maven-plugin,直接用这个插件运行项目,它会自动把所有依赖加入类路径:
mvn exec:java -Dexec.mainClass="hibernate.SmartDevice"
这种方式适合开发阶段快速调试,不用处理打包问题。
方式2:打包成包含所有依赖的「可执行Fat Jar」
如果需要生成一个可以独立运行的JAR文件,推荐使用maven-shade-plugin,它会把所有依赖包合并到你的JAR里,生成一个"胖JAR"。修改你的pom.xml的<build><plugins>部分,添加这个插件的配置:
<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>hibernate.SmartDevice</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
配置完成后,执行打包命令:
mvn clean package
打包完成后,在target目录下会生成两个JAR:
- 原来的
hibernate-1.0-SNAPSHOT.jar:仅包含你自己的代码; - 新增的
hibernate-1.0-SNAPSHOT-shaded.jar:包含所有依赖的可执行JAR。
运行这个带-shaded后缀的JAR即可:
java -jar target/hibernate-1.0-SNAPSHOT-shaded.jar
补充说明
你原来的maven-jar-plugin配置可以保留,它和maven-shade-plugin不会冲突,两者会生成不同的JAR文件。另外也可以用maven-assembly-plugin实现类似功能,但shade-plugin在处理依赖冲突、合并资源文件等场景下更友好。
内容的提问来源于stack exchange,提问作者Máté Belényesi
相关产品推荐
相关产品推荐

