Spring Boot多模块项目移除重复javax.persistence依赖问题
解决JPA版本冲突与实体识别问题
1. 统一JPA依赖版本,解决冲突
Spring Boot 2.4.4基于javax.persistence体系(Jakarta是Spring Boot 3.x才切换的规范),所以authlib里不要手动引入javax.persistence:persistence-api或Jakarta相关依赖,直接依托Spring Boot的依赖管理来控制版本:
- 在authlib的
build.gradle.kts中,删除手动添加的persistence-api依赖,改为引入Spring Boot管理的JPA规范依赖:
这样Gradle会自动使用Spring Boot 2.4.4依赖管理中定义的2.2.3版本,彻底避免版本冲突。dependencies { // 直接引入Spring Boot管控的JPA API,自动匹配server项目的版本 implementation("javax.persistence:javax.persistence-api") } - 若authlib需要用到JPA的实现类(比如Hibernate相关),也可以直接依赖Spring Boot的JPA starter并排除不需要的模块:
dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") { exclude(group = "org.springframework.boot", module = "spring-boot-starter") exclude(group = "com.zaxxer", module = "HikariCP") } }
2. 解决实体未被识别的问题
实体移到authlib后,Spring Boot默认只会扫描自身项目下的实体类,需手动指定扫描范围包含authlib的实体包:
- 在server项目的启动类上添加
@EntityScan注解,明确标注authlib实体所在的包路径:import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EntityScan(basePackages = {"com.your.server.entity", "com.your.authlib.entity"}) // 替换为实际包路径 public class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); } } - 若不想写包路径,也可以直接指定实体类的字节码:
@EntityScan(basePackageClasses = {User.class, Role.class}) // User、Role为authlib中的实体类
3. 额外检查项
- 确认authlib中的实体类都正确标注了
@Entity、@Id等必要注解; - 检查server项目的依赖配置,确保authlib依赖未被意外排除;
- 执行
./gradlew clean build清理构建缓存,避免旧依赖残留引发问题。
内容的提问来源于stack exchange,提问作者monamona
相关产品推荐
相关产品推荐

