Spring Boot启动报错:重复定义jakarta.persistence.TemporalType
问题:Spring Boot启动触发LinkageError(重复类定义)
环境配置
Java 21 Spring Boot 3.3.2 VM options: -javaagent:/aspectjweaver-1.9.22.1.jar -javaagent:/spring-instrument-6.1.11.jar
错误信息
Caused by: java.lang.LinkageError: loader 'app' attempted duplicate class definition for jakarta.persistence.TemporalType. (jakarta.persistence.TemporalType is in unnamed module of loader 'app') at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) at org.hibernate.type.descriptor.jdbc.TimestampUtcAsJdbcTimestampJdbcType.getJdbcLiteralFormatter(TimestampUtcAsJdbcTimestampJdbcType.java:77) at org.hibernate.type.AbstractStandardBasicType.<init>(AbstractStandardBasicType.java:65) at org.hibernate.type.AbstractSingleColumnStandardBasicType.<init>(AbstractSingleColumnStandardBasicType.java:27) at org.hibernate.type.internal.BasicTypeImpl.<init>(BasicTypeImpl.java:29) at org.hibernate.type.internal.NamedBasicTypeImpl.<init>(NamedBasicTypeImpl.java:20) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.adaptTimestampTypesToDefaultTimeZoneStorage(MetadataBuildingProcess.java:810) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:732) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:176) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ... 34 common frames omitted
原因分析与解决方案
核心原因
jakarta.persistence.TemporalType类被类加载器重复定义,大概率是AspectJ Weaver的jar包与项目依赖的Jakarta Persistence API存在类冲突,或是AspectJ版本与Spring Boot 3.x(基于Jakarta EE规范)不兼容。
解决步骤
替换AspectJ依赖方式
移除手动指定的aspectjweaver-1.9.22.1.jar,改用Spring Boot官方提供的spring-boot-starter-aop依赖,它会自动管理兼容的AspectJ版本,避免版本不匹配问题:<!-- Maven --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>// Gradle implementation 'org.springframework.boot:spring-boot-starter-aop'检查并排除重复依赖
执行依赖树分析命令,排查是否存在多个来源的Jakarta Persistence API:- Maven:
mvn dependency:tree - Gradle:
./gradlew dependencies
找到重复的jakarta.persistence:jakarta.persistence-api依赖,通过<exclusions>(Maven)或exclude(Gradle)排除多余的引入。
- Maven:
统一Spring Instrument版本
保持spring-instrument版本与Spring Boot版本完全一致,当前Spring Boot 3.3.2对应Spring 6.1.11,你的配置是正确的,但建议通过依赖引入而非手动指定javaagent(如果场景允许):<!-- Maven --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-instrument</artifactId> <scope>runtime</scope> </dependency>调整VM参数(若必须手动使用javaagent)
确保使用的aspectjweaver是支持Jakarta EE的版本(1.9.19+),并且该jar包不包含jakarta.persistence下的类——建议从官方渠道下载纯净版的aspectjweaver,避免被篡改的包。
内容的提问来源于stack exchange,提问作者qwer
相关产品推荐
相关产品推荐

