ANTLR版本冲突求助:Jaybird与Hibernate依赖版本不兼容
ANTLR版本冲突解决指南
问题描述
代码生成依赖的ANTLR Tool版本4.10.1与运行时版本4.7不匹配,冲突源于两个第三方依赖:
- Jaybird-jdk17:3.0.10 自带
antlr4-runtime:4.7 - hibernate-core:6.1.5.Final 依赖
antlr4:4.10.1
尝试更换Jaybird版本、调整Hibernate依赖均未解决问题。
解决方案
方案1:统一ANTLR版本(无需升级Jaybird)
在pom.xml的<properties>节点中强制指定ANTLR版本,让所有依赖统一使用4.10.1:
<properties> <java.version>17</java.version> <antlr4.version>4.10.1</antlr4.version> </properties>
同时排除Jaybird自带的antlr4-runtime依赖,避免版本冲突:
<dependency> <groupId>org.firebirdsql.jdbc</groupId> <artifactId>jaybird-jdk17</artifactId> <version>3.0.10</version> <exclusions> <exclusion> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> </exclusion> </exclusions> </dependency>
最后手动添加统一版本的antlr4-runtime依赖:
<dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>${antlr4.version}</version> </dependency>
方案2:升级Jaybird到兼容版本
Jaybird 4.x及以上版本已将ANTLR runtime依赖升级到4.9.3,与Hibernate 6.x的ANTLR版本天然兼容。直接替换jaybird-jdk17的版本即可:
<dependency> <groupId>org.firebirdsql.jdbc</groupId> <artifactId>jaybird-jdk17</artifactId> <version>4.0.0.java17</version> </dependency>
相关代码与配置
实体类
package com.aula.restiapi.entidade; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Entity @NoArgsConstructor @AllArgsConstructor @Data @Table(name = "tb_users") public class Usuario { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; private Double salary; }
仓库层
package com.aula.restiapi.repository; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import com.aula.restiapi.entidade.Usuario; @Repository public interface UsuarioRepository extends JpaRepository<Usuario, Long>{ @Query("SELECT obj FROM User obj WHERE obj.salary >= :minSalary AND obj.salary <= :maxSalary") Page<Usuario> searchBySalary(Double minSalary, Double maxSalary, Pageable pageable); }
控制器
package com.aula.restiapi.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.aula.restiapi.entidade.Usuario; import com.aula.restiapi.repository.UsuarioRepository; @RestController @RequestMapping(value = "/users") public class UserController { @Autowired private UsuarioRepository repository; @GetMapping public ResponseEntity<List<Usuario>> findAll() { List<Usuario> result = repository.findAll(); return ResponseEntity.ok(result); } @GetMapping(value = "/page") public ResponseEntity<Page<Usuario>> findAll(Pageable pageable) { Page<Usuario> result = repository.findAll(pageable); return ResponseEntity.ok(result); } @GetMapping(value = "/search-salary") public ResponseEntity<Page<Usuario>> searchBySalary(@RequestParam(defaultValue = "0") Double minSalary, @RequestParam(defaultValue = "1000000000000") Double maxSalary, Pageable pageable) { Page<Usuario> result = repository.searchBySalary(minSalary, maxSalary, pageable); return ResponseEntity.ok(result); } }
application.properties
spring.datasource.url:jdbc:firebirdsql:localhost/3050:C:/DB/BD_ARTISTS.FDB? sql_dialect=3&charSet=utf-8 spring.datasource.username:SYSDBA spring.datasource.password:masterkey spring.datasource.driver-class-name=org.firebirdsql.jdbc.FBDriver spring.jpa.database-platform=org.hibernate.community.dialect.FirebirdDialect spring.jpa.show-sql: true spring.jpa.properties.hibernate.format_sql=true #logging.level.org.springframework=DEBUG app.path.arquivos=/Users/Paulo/Pictures/SavedPictures spring.servlet.multipart.max-file-size=30MB spring.servlet.multipart.max-request-size=30MB
原始pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.0</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.aula</groupId> <artifactId>restiapi</artifactId> <version>0.0.1-SNAPSHOT</version> <name>restiapi</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>org.firebirdsql.jdbc</groupId> <artifactId>jaybird-jdk17</artifactId> <version>3.0.10</version> </dependency> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-community-dialects</artifactId> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.5.0</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
内容的提问来源于stack exchange,提问作者Paulo Cesar Pereira da costa
相关产品推荐
相关产品推荐

