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

 更新时间:2020年02月04日 09:13:29   作者:栖息之鹰  
这篇文章主要介绍了解决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 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 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阶段之间执行,详细可参考这里

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

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

 <plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>apt-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <outputDirectory>target/generated-sources/java</outputDirectory>
              <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>4.1.3</version>
          </dependency>

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,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

<version>1.1.3</version>

再次generate,生成成功!

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

总结

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

相关文章

  • 使用Java对Hbase操作总结及示例代码

    使用Java对Hbase操作总结及示例代码

    这篇文章主要介绍了使用Java对Hbase进行操作总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Springboot @Transactional大事务处理的几点建议

    Springboot @Transactional大事务处理的几点建议

    本文主要介绍了大事务的概念及其危害,并提出了几种解决大事务问题的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • SpringBoot项目Jar包如何瘦身部署的实现

    SpringBoot项目Jar包如何瘦身部署的实现

    这篇文章主要介绍了SpringBoot项目Jar包如何瘦身部署的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解Mybatis分页插件 - 示例代码

    详解Mybatis分页插件 - 示例代码

    这篇文章主要介绍了详解Mybatis分页插件 - 示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2016-12-12
  • 深入分析Android系统中SparseArray的源码

    深入分析Android系统中SparseArray的源码

    这篇文章主要介绍了深入分析Android系统中SparseArray的源码,SparseArray为Java实现,需要的朋友可以参考下
    2015-07-07
  • Java中获取文件大小的详解及实例代码

    Java中获取文件大小的详解及实例代码

    这篇文章主要介绍了Java中获取文件大小的详解及实例代码的相关资料,一种是使用File的length()方法,另外一种是使用FileInputStream的available()方法,这里就说下如何使用需要的朋友可以参考下
    2016-12-12
  • 使用JPA自定义VO类型转换(EntityUtils工具类)

    使用JPA自定义VO类型转换(EntityUtils工具类)

    这篇文章主要介绍了使用JPA自定义VO类型转换(EntityUtils工具类),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java实现XML与JSON秒级转换示例详解

    Java实现XML与JSON秒级转换示例详解

    这篇文章主要为大家介绍了Java实现XML与JSON秒级转换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot项目启动过程动态修改接口请求路径的解决方案

    SpringBoot项目启动过程动态修改接口请求路径的解决方案

    在SpringBoot服务整合过程中,遇到了多个服务中相同RequestMapping路径导致的启动问题,解决方案是通过修改RequestMappingHandlerMapping类的getMappingForMethod方法,本文给大家介绍SpringBoot修改接口请求路径的解决方案,感兴趣的朋友一起看看吧
    2024-09-09
  • java并发容器CopyOnWriteArrayList实现原理及源码分析

    java并发容器CopyOnWriteArrayList实现原理及源码分析

    这篇文章主要为大家详细介绍了java并发容器CopyOnWriteArrayList实现原理及源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论