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 中的类,如下图:
进一步可以确定应该是 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:compile 和 org.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)点击红框图标,如下图:
(2)查看 maven 依赖图,如下图:
(3)按 Ctrl + F 打开 Diagram Elements 弹框,找到 ognl 依赖项,如下图:
(4)点击它,可以查看它的上下依赖关系,如下图:
最后,将找到的模块添加依赖排除,如下:
<dependency> <groupId>***</groupId> <artifactId>***</artifactId> <version>***</version> <exclusions> <!-- 排除 javassist 依赖 --> <exclusion> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency>
保存修改,重启项目试试呢!