Idea的Generate Sources无法生成QueryDSL问题及解决方法

网友投稿 1215 2023-06-28

Idea的Generate Sources无法生成QueryDSL问题及解决方法

Idea的Generate Sources无法生成QueryDSL问题及解决方法

QueryDSL简介

官网

1 QueryDSL仅仅是一个通用的查询框架,专注于通过java API构建类型安全的SQL查询。

2 Querydsl可以通过一组通用的查询API为用户构建出适合不同类型ORM框架或者是SQL的查询语句,也就是说QueryDSL是基于各种ORM框架以及SQL之上的一个通用的查询框架。

3 借助QueryDSL可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建查询。目前QueryDSL支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。

今天是2020年第一天在家办公,就出现了跟在公司不一样的现象,deploy项目到maven库时失败,之前一直成功。

查到原因在于QueryDSL类没有生成,但为何在公司可以而在家里就不行呢?

鉴于Idea的“Generate Sources And Update Folders”操作一闪即过,信息太少,所以不得先从原理上追溯

1. 首先的疑问是:当执行Idea的“Generate Sources And Update Folders”操作时,都发生了什么?

参考stackoverflow,解释如下

In order to get generated sources automatically imported as source folders configure corresponding plugins

so that they put them into target/generated-sources/, where subdir is any folder name you prefer.

The subdir folder is necessary to distinguish sources from different tools and also to exclude some http://special generated sources (e.g. groovy stubs).

Please note that even if you manually configure some source folders under target/generated-sources of this folder itself,

IDEA will rewrite them according to http://your pom.xml.

Any time you want to generate sources you simply execute the corresponding goal,

bound for generation (usually generate-sources, generate-test-sources). After that IDEA will pick up new folders and set them up.

As you can see Generate Sources action runs the generate-sources Maven phase for any plug-ins in your pom.xml that do generate any sources.

“Generate Source”实际上是用所有可以生成source的插件执行Maven的generate-sources步骤

这里需要了解的是Maven的phase都有哪些?generate-sources是什么时机执行的?

答案是generates阶段会在validate和compile阶段之http://间执行,详细可参考这里

2. 那么第二个问题来了,我们的项目中哪些plugin可以执行generate sources?

很容易找到下面的配置(此插件开源在github上)

com.mysema.maven

apt-maven-plugin

process

target/generated-sources/java

com.querydsl.apt.jpa.JPAAnnotationProcessor

com.querydsl

querydsl-apt

4.1.3

github的解释很简单:apt-maven-plugin provides Maven integration of the Java 6 APT functionality.

这里有必要了解下什么是Java APT?

APT(Annotation Process Tool),是一种在代码编译时处理注解,按照一定的规则,生成相应的java文件,多用于对自定义注解的处理,

目前比较流行的Dagger2, ButterKnife, EventBus3都是采用APT技术,对运行时的性能影响很小

也就是说,APT是用代码生成代码的工具,会在process过程生成java文件,那么为什么我们最终生成的往往只有class文件呢?这是因为很多插件都做了第二步的清理操作。

至于Java8之后APT被“"Pluggable Annotation Processing API".”替换,那就是后话了

  另外,此插件依赖querydsl,所以querydsl也有必要了解下

QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询。借助QueryDSL可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建查询。

目前QueryDSL支持的平台包括JPA,JDO,SQL,http://Java Collections,RDF,Lucene,Hibernate Search。

所以说我们项目中所用的QueryDSL是在JPA之上的,是为了补充JPA的复杂查询支持不足而引入的

3. 那么如何手动单独执行此APT的process呢?

这样考虑的目的其实就是为了得到更多信息,此步骤可以用Idea的此选项右键执行,或者在command中执行“mvn apt:process”

会发现输出log中输出以下警告

'build.plugins.plugin.version' for com.mysema.maven:apt-maven-plugin is missing. @ line 46, column 21

于是就在pom配置中添加plugin的最新version

1.1.3

再次generate,生成成功!

通过解决此问题得到一点感触:每一次出现问题不好解决时,尝试从原理层面做一个快速全面的了解,这样不单会有助于使自己对于技术“知其所以然”,而且会反过来触发解决问题的新思路。

总结

以上所述是给大家介绍的Idea的Generate Sources无法生成QueryDSL问题及解决方法,希望对大家有所帮助!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:移动警务通有什么用?移动警务通套餐如何办理?
下一篇:移动警务系统架构有哪些?移动警务系统总体技术要求
相关文章

 发表评论

暂时没有评论,来抢沙发吧~