Spring Boot+Java 9+Querydsl环境下apt-maven-plugin生成Q类失败求助
解决Java 9 + Maven + Querydsl环境下APT生成Q-types卡住的问题
我之前也踩过这个坑!Java 9的模块系统确实会给Querydsl的APT处理带来不少麻烦,尤其是添加module-info.java之后,旧的apt-maven-plugin在模块模式下的兼容性很差。下面是我亲测有效的解决方案:
1. 替换apt-maven-plugin为Maven编译器内置的APT支持
Java 9之后,官方推荐直接使用maven-compiler-plugin的APT功能,而不是单独的APT插件。把你原来的apt-maven-plugin配置替换成下面这样:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <!-- 至少用3.8.x版本,支持Java 9+ --> <configuration> <release>9</release> <annotationProcessorPaths> <path> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <classifier>jpa</classifier> <!-- 如果你用JPA的话 --> </path> <path> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.2.Final</version> </path> </annotationProcessorPaths> </configuration> </plugin>
2. 调整module-info.java的模块声明
Querydsl需要访问你的实体类,并且在生成Q-types时需要反射权限,所以必须在模块声明里做如下配置:
module your.module.name { // 引入Querydsl相关模块 requires querydsl.core; requires querydsl.jpa; requires javax.persistence; // 开放你的实体类所在包给Querydsl,允许它反射访问 opens com.yourpackage.entities to querydsl.core; // 如果你的Q-types生成在同一个模块里,还要导出这个包(可选,看你是否在其他地方使用Q-types) exports com.yourpackage.entities.querydsl; }
3. 确保Querydsl版本兼容Java 9
一定要使用Querydsl 4.2.0及以上版本,旧版本(比如3.x)完全不支持Java 9的模块系统,会出现各种奇怪的兼容性问题。
4. 清理Maven缓存并重新构建
有时候缓存的旧编译产物会干扰新的模块编译,执行以下命令彻底清理后重新构建:
mvn clean install -U
如果按照上面的步骤操作,应该就能解决APT生成Q-types卡住的问题了。我当时就是靠这套配置搞定了Java 9下的Querydsl环境。
内容的提问来源于stack exchange,提问作者bfeater
相关产品推荐
相关产品推荐

