快速解决 org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile 错误

本文将介绍怎样根据错误日志分析和解决 org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile 错误。

环境介绍

windows10

jdk8

spring boot 1.5.17

idea 2023

错误堆栈

[WARN ]-[23-09-14 10:29:18 642]-[main]-[o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext]: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile
[ERROR]-[23-09-14 10:29:18 685]-[main]-[o.s.b.SpringApplication]: Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1631)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:481)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1080)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
	at com.hxstrive.server.demo.DemoApplication.main(DemoApplication.java:23)
Caused by: org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile
	at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.toClassFile(ClassFileArchiveEntryHandler.java:64)
	at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.handleEntry(ClassFileArchiveEntryHandler.java:47)
	at org.hibernate.boot.archive.internal.ExplodedArchiveDescriptor.processDirectory(ExplodedArchiveDescriptor.java:143)
	at org.hibernate.boot.archive.internal.ExplodedArchiveDescriptor.processDirectory(ExplodedArchiveDescriptor.java:118)
	at org.hibernate.boot.archive.internal.ExplodedArchiveDescriptor.processDirectory(ExplodedArchiveDescriptor.java:118)
	at org.hibernate.boot.archive.internal.ExplodedArchiveDescriptor.processDirectory(ExplodedArchiveDescriptor.java:118)
	at org.hibernate.boot.archive.internal.ExplodedArchiveDescriptor.processDirectory(ExplodedArchiveDescriptor.java:118)
	at org.hibernate.boot.archive.internal.ExplodedArchiveDescriptor.processDirectory(ExplodedArchiveDescriptor.java:118)
	at org.hibernate.boot.archive.internal.ExplodedArchiveDescriptor.processDirectory(ExplodedArchiveDescriptor.java:118)
	at org.hibernate.boot.archive.internal.ExplodedArchiveDescriptor.processDirectory(ExplodedArchiveDescriptor.java:118)
	at org.hibernate.boot.archive.internal.ExplodedArchiveDescriptor.visitArchive(ExplodedArchiveDescriptor.java:54)
	at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:47)
	at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:75)
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:98)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:199)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:149)
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:54)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:360)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:384)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:336)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1689)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1627)
	... 14 common frames omitted
Disconnected from the target VM, address: '127.0.0.1:62468', transport: 'socket'

Process finished with exit code 1

解决问题

根据上面的错误日志大概可以知道是,因为 ClassFile 是 javassist 中的类,如下图:

快速解决 org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile 错误

进一步可以确定应该是 javassist 包冲突导致,此时,使用 mvn dependency:tree 命令查看项目的依赖关系,如下:

...
[INFO] |  +- javax.servlet:jstl:jar:1.2:compile
[INFO] |  +- net.sf.json-lib:json-lib:jar:jdk15:2.1:compile
[INFO] |  |  +- commons-beanutils:commons-beanutils:jar:1.9.3:compile
[INFO] |  |  +- commons-collections:commons-collections:jar:3.2.2:compile
[INFO] |  |  +- commons-logging:commons-logging:jar:1.1:compile
[INFO] |  |  \- net.sf.ezmorph:ezmorph:jar:1.0.3:compile
[INFO] |  +- ognl:ognl:jar:3.0.5:compile
[INFO] |  |  \- javassist:javassist:jar:3.11.0.GA:compile 【我在这里】
[INFO] |  +- org.hibernate:hibernate-entitymanager:jar:5.0.12.Final:compile
[INFO] |  |  +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:compile
[INFO] |  |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  +- org.hibernate.common:hibernate-commons-annotations:jar:5.0.1.Final:compile
[INFO] |  |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] |  |  +- org.javassist:javassist:jar:3.21.0-GA:compile 【我在这里】
[INFO] |  |  \- org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1.1:compile
[INFO] |  +- org.hibernate:hibernate-ehcache:jar:5.0.12.Final:compile
[INFO] |  |  \- net.sf.ehcache:ehcache-core:jar:2.4.3:compile
...

从上面输出可以看出,有两个 javassist 依赖,分别是 javassist:javassist:jar:3.11.0.GA:compileorg.javassist:javassist:jar:3.21.0-GA:compile,可以尝试将 javassist:javassist:jar:3.11.0.GA:compile 依赖排除。

那么问题来了,怎样确定 org.javassist:javassist:jar:3.21.0-GA:compile 依赖在那个模块呢?可以看出该依赖是由 ognl:ognl:jar:3.0.5:compile 引入的。此时进入 IDEA,打开 Maven 侧边栏,根据下面步骤操作:

(1)点击红框图标,如下图:

快速解决 org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile 错误

(2)查看 maven 依赖图,如下图:

快速解决 org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile 错误

(3)按 Ctrl + F 打开 Diagram Elements 弹框,找到 ognl 依赖项,如下图:

快速解决 org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile 错误

(4)点击它,可以查看它的上下依赖关系,如下图:

快速解决 org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile 错误

最后,将找到的模块添加依赖排除,如下:

<dependency>
    <groupId>***</groupId>
    <artifactId>***</artifactId>
    <version>***</version>
    <exclusions>
        <!-- 排除 javassist 依赖 -->
        <exclusion>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
        </exclusion>
    </exclusions>
</dependency>

保存修改,重启项目试试呢!

人永远是要学习的。死的时候,才是毕业的时候。 —— 萧楚女
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号