Maven引入Hibernate依赖后IDEA运行正常 控制台执行jar包抛出异常
异常触发原因
- 该错误本质是运行时classpath缺失Hibernate依赖的JBoss Logging相关实现类,或日志服务配置被覆盖。
- IntelliJ IDEA运行时会自动将所有Maven依赖加载到classpath,因此运行正常;直接控制台运行jar时,若jar未内置依赖、或打fatjar时合并资源出错,就会触发该异常。
- Hibernate 5.x依赖JBoss Logging框架,该框架会动态生成
org.hibernate.internal.CoreMessageLogger这类日志接口的实现类,若打包时缺失相关依赖或服务注册配置,就会抛出实现类未找到的错误。
解决方案
1. 显式引入JBoss Logging依赖
先在pom.xml中添加JBoss Logging依赖,避免传递依赖版本冲突:
<dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.4.2.Final</version> </dependency>
2. 正确打包包含所有依赖的可执行jar
默认maven-jar-plugin不会将依赖打入jar包,需要选用专门的打包插件:
普通Java项目使用maven-assembly-plugin
<plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>替换为你的项目主类全限定名</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 package后,使用生成的带jar-with-dependencies后缀的jar包运行即可。
存在多依赖资源合并冲突时使用maven-shade-plugin
如果打fatjar后仍报错,大概率是多个依赖的META-INF/services配置被覆盖,使用以下配置合并资源:
<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.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>替换为你的项目主类全限定名</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
内容的提问来源于stack exchange,提问作者Dima Avramenko
相关产品推荐
相关产品推荐

