Idea的Generate Sources无法生成QueryDSL问题及解决方法
QueryDSL简介
官网
1QueryDSL仅仅是一个通用的查询框架,专注于通过JavaAPI构建类型安全的SQL查询。
2Querydsl可以通过一组通用的查询API为用户构建出适合不同类型ORM框架或者是SQL的查询语句,也就是说QueryDSL是基于各种ORM框架以及SQL之上的一个通用的查询框架。
3借助QueryDSL可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建查询。目前QueryDSL支持的平台包括JPA,JDO,SQL,JavaCollections,RDF,Lucene,HibernateSearch。
今天是2020年第一天在家办公,就出现了跟在公司不一样的现象,deploy项目到maven库时失败,之前一直成功。
查到原因在于QueryDSL类没有生成,但为何在公司可以而在家里就不行呢?
鉴于Idea的“GenerateSourcesAndUpdateFolders”操作一闪即过,信息太少,所以不得先从原理上追溯
1.首先的疑问是:当执行Idea的“GenerateSourcesAndUpdateFolders”操作时,都发生了什么?
参考stackoverflow,解释如下
Inordertogetgeneratedsourcesautomaticallyimportedassourcefoldersconfigurecorrespondingplugins sothattheyputthemintotarget/generated-sources/,wheresubdirisanyfoldernameyouprefer. Thesubdirfolderisnecessarytodistinguishsourcesfromdifferenttoolsandalsotoexcludesomespecialgeneratedsources(e.g.groovystubs). Pleasenotethatevenifyoumanuallyconfiguresomesourcefoldersundertarget/generated-sourcesofthisfolderitself, IDEAwillrewritethemaccordingtoyourpom.xml. Anytimeyouwanttogeneratesourcesyousimplyexecutethecorrespondinggoal, boundforgeneration(usuallygenerate-sources,generate-test-sources).AfterthatIDEAwillpickupnewfoldersandsetthemup. AsyoucanseeGenerateSourcesactionrunsthegenerate-sourcesMavenphaseforanyplug-insinyourpom.xmlthatdogenerateanysources. “GenerateSource”实际上是用所有可以生成source的插件执行Maven的generate-sources步骤
这里需要了解的是Maven的phase都有哪些?generate-sources是什么时机执行的?
答案是generates阶段会在validate和compile阶段之间执行,详细可参考这里
2.那么第二个问题来了,我们的项目中哪些plugin可以执行generatesources?
很容易找到下面的配置(此插件开源在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-pluginprovidesMavenintegrationoftheJava6APTfunctionality.
这里有必要了解下什么是JavaAPT?
APT(AnnotationProcessTool),是一种在代码编译时处理注解,按照一定的规则,生成相应的java文件,多用于对自定义注解的处理,
目前比较流行的Dagger2,ButterKnife,EventBus3都是采用APT技术,对运行时的性能影响很小
也就是说,APT是用代码生成代码的工具,会在process过程生成java文件,那么为什么我们最终生成的往往只有class文件呢?这是因为很多插件都做了第二步的清理操作。
至于Java8之后APT被“"PluggableAnnotationProcessingAPI".”替换,那就是后话了
另外,此插件依赖querydsl,所以querydsl也有必要了解下
QueryDSL仅仅是一个通用的查询框架,专注于通过JavaAPI构建类型安全的SQL查询。借助QueryDSL可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建查询。
目前QueryDSL支持的平台包括JPA,JDO,SQL,JavaCollections,RDF,Lucene,HibernateSearch。
所以说我们项目中所用的QueryDSL是在JPA之上的,是为了补充JPA的复杂查询支持不足而引入的
3.那么如何手动单独执行此APT的process呢?
这样考虑的目的其实就是为了得到更多信息,此步骤可以用Idea的此选项右键执行,或者在command中执行“mvnapt:process”
会发现输出log中输出以下警告
'build.plugins.plugin.version'forcom.mysema.maven:apt-maven-pluginismissing.@line46,column21
于是就在pom配置中添加plugin的最新version
再次generate,生成成功!
通过解决此问题得到一点感触:每一次出现问题不好解决时,尝试从原理层面做一个快速全面的了解,这样不单会有助于使自己对于技术“知其所以然”,而且会反过来触发解决问题的新思路。
总结
以上所述是小编给大家介绍的Idea的GenerateSources无法生成QueryDSL问题及解决方法,希望对大家有所帮助!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。