【问题标题】:Upgrade to springboot 2.6.1 with querydsl jpa 5.0.0使用 querydsl jpa 5.0.0 升级到 springboot 2.6.1
【发布时间】:2022-01-20 05:55:56
【问题描述】:

我正在尝试将我的 springboot 版本从 2.3.4 升级到 2.6.1。我将查询 dsl 与 jpa 和 apt-maven-plugin 一起使用。我的问题是,当我运行 maven compile 时,我无法再生成 QClasses。我注意到我不再能够使用旧版本的 querydsl(以前的 4.4.0 和 apt-maven-plugin 1.1.3)。现在当我尝试使用 4.4.0 时出现错误:

无法解析的导入 POM: com.querydsl:querydsl-bom:pom:4.4.0 在https://repo.maven.apache.org/maven2 中找不到

然后当我切换到 5.0.0 版本时,我遇到了另一个错误:

[INFO] --- apt-maven-plugin:1.1.3:process (默认) @ gof-referentiel-backend --- [警告] 工件 org.apache.commons:commons-io:jar:1.3.2 已重新定位到 commons-io:commons-io:jar:1.3.2:https://issues.sonatype.org/browse/MVNCENTRAL-244 /home/ezek/Documents/projects/gof-referentiel-backend/src/main/java/fr/ubordeaux/gof/referentiel/common/persistence/dao/impl/ContactDAOImpl.java:12:错误:找不到符号 导入 fr.ubordeaux.gof.referentiel.common.persistence.entity.QContactEntity; ^ 符号:QContactEntity 类 位置:包 fr.ubordeaux.gof.referentiel.common.persistence.entity /home/ezek/Documents/projects/gof-referentiel-backend/src/main/java/fr/ubordeaux/gof/referentiel/common/persistence/dao/impl/ContactDAOImpl.java:29:错误:找不到符号 私有静态最终 QContactEntity qContactEntity = QContactEntity.contactEntity;

对于所有使用实体的类,我都会收到此错误。并且什么也没有生成。

这是我的 pom.xml 的相关值:

> <dependency>
>      <groupId>com.querydsl</groupId>
>      <artifactId>querydsl-apt</artifactId>
>      <version>${querydsl.version}</version> 
> </dependency> 
> <dependency>
>      <groupId>com.querydsl</groupId>
>      <artifactId>querydsl-jpa</artifactId>
>      <version>${querydsl.version}</version> 
> </dependency>
> 
> <plugin>
>      <groupId>com.mysema.maven</groupId>
>      <artifactId>apt-maven-plugin</artifactId>
>      <version>1.1.3</version>
>      <executions>
>          <execution>
>              <phase>generate-sources</phase>
>              <goals>
>                  <goal>process</goal>
>              </goals>
>              <configuration>
>                  <outputDirectory>target/generated-sources/java</outputDirectory>      
> 
>                      <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
>              </configuration>
>           </execution>
>      </executions> 
></plugin>

如果可能相关(但我不认为),我也使用 mapstruct 和 lombok,因为 apt-maven-plugin 在它们之前运行。

【问题讨论】:

  • Spring Boot 2.6.1 支持开箱即用的 querydsl 5.0.0。所以删除 version 标签,让 Spring Boot 管理它。我怀疑您也可以从插件中删除phase。最后,querydsl-apt 依赖可以使用提供的范围。尝试同时使用所有这些不同的处理器(lombok、mapstruct 和 querydsl)可能是一个痛苦的过程。尤其是使用 lombok,因为它会做一些官方不允许做的事情。
  • 另外,“错误”是警告而不是错误。检查 commons-io 的依赖项并使用正确的位置。
  • 我设法删除了警告并删除了 querydsl 版本,但仍然得到相同的结果。该错误与警告下的错误相同
  • 在运行的 maven 上启用调试并检查发生了什么。我不会惊讶这会是由龙目岛引起的。
  • 但我不知道lombok应该在querydsl之前还是之后运行。我知道在以前的版本中它是在之后但也许......

标签: java spring-boot maven jpa querydsl


【解决方案1】:

看来您仍然(可能是过渡性地)依赖于一些 Querydsl 4.0.0 依赖项。您需要删除那些(我无法指出哪些,因为您没有在 sn-p 中包含完整的 POM)。

我还建议完全摆脱插件,而是使用依赖分类器:

 <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-apt</artifactId>
      <version>${querydsl.version}</version> 
      <classifier>jpa</classifier>
      <scope>provided</scope>
 </dependency> 
 <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-jpa</artifactId>
      <version>${querydsl.version}</version> 
 </dependency>

【讨论】:

  • 摆脱插件意味着删除 apt-maven-plugin ?
  • 是的。它不需要。
  • 如何在构建过程中生成 QClasses?你能举个例子吗?
  • 使用正确的分类器时,QClasses 会在常规编译阶段生成。
猜你喜欢
  • 2022-01-13
  • 2021-11-06
  • 1970-01-01
  • 2018-09-28
  • 2023-03-14
  • 2018-03-18
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多