【问题标题】:Spring Boot 2 + Java 9 + QuerydslSpring Boot 2 + Java 9 + Querydsl
【发布时间】:2018-09-10 20:31:24
【问题描述】:

我已成功将我的应用程序(Spring Boot + Java + Maven)更新到 Spring Boot 2。现在我正在尝试更新到 Java 9。

根据 Nicolas Fränkel 的博客文章 (Migrating a Spring Boot application to Java 9 - Compatibility),我完成了在不使用模块信息文件的情况下更新到 Java 9。但是当我创建这样一个文件时,apt-maven-plugin 卡在创建 Q-types 上。

有人使用 Java 9 + Maven + Querydsl 成功完成了吗?

我对 apt-maven-plugin 的 Maven 配置如下:

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

当我运行 mvn generate-sources 时,插件只打印一堆错误消息,不生成任何类并报告成功:

$ mvn generate-sources
...
[INFO] --- apt-maven-plugin:1.1.3:process (default) @ app ---
.../src/main/java/module-info.java:9: error: module not found: java.validation
   requires java.validation;
                ^
.../src/main/java/module-info.java:13: error: module not found: hibernate.jpa
   requires hibernate.jpa;
                     ^
...
21 errors
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.484 s
[INFO] Finished at: 2018-04-01T13:11:25+02:00
[INFO] ------------------------------------------------------------------------

【问题讨论】:

  • 你找到解决方法了吗?

标签: spring-boot querydsl java-9


【解决方案1】:

同时使用 QueryDSL + Mapstruct 和 Lombok:

<plugin>
    <groupId>com.mysema.maven</groupId>
    <artifactId>apt-maven-plugin</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <outputDirectory>target/generated-sources/annotations</outputDirectory>
                <processors>
                    <processor>lombok.launch.AnnotationProcessorHider$AnnotationProcessor</processor>
                    <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                    <processor>org.mapstruct.ap.MappingProcessor</processor>
                </processors>
            </configuration>
        </execution>
    </executions>
</plugin>

【讨论】:

    【解决方案2】:

    querydsl 与 hibernate 5.2 尚不兼容,请参阅此处https://github.com/querydsl/querydsl/issues/1917 (与您提到的错误无关,但很高兴知道......)

    关于您的错误,您可以尝试使用 https://plugins.gradle.org/plugin/net.ltgt.apt 吗?我不得不使用它,因为我无法同时使用 QueryDSL 和 Lombok...

    plugins {
      id "net.ltgt.apt" version "0.12"
    }
    
    
    apply plugin: "net.ltgt.apt"
    
    
    compileJava {
      aptOptions.processors =
          ['com.querydsl.apt.jpa.JPAAnnotationProcessor', 'lombok.launch.AnnotationProcessorHider$AnnotationProcessor']
    }
    

    【讨论】:

      【解决方案3】:

      试试 maven-compiler-plugin,而不是 apt-maven-plugin。

      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.7.0</version>
          <configuration>
              <source>9</source>
              <target>9</target>
              <annotationProcessors>
                  <annotationProcessor>com.querydsl.apt.jpa.JPAAnnotationProcessor</annotationProcessor>
              </annotationProcessors>
              <annotationProcessorPaths>
                  <path>
                      <groupId>com.querydsl</groupId>
                      <artifactId>querydsl-core</artifactId>
                      <version>4.1.4</version>
                  </path>
                  <path>
                      <groupId>com.querydsl</groupId>
                      <artifactId>querydsl-apt</artifactId>
                      <version>4.1.4</version>
                  </path>
                  <path>
                      <groupId>com.mysema.codegen</groupId>
                      <artifactId>codegen</artifactId>
                      <version>0.6.8</version>
                  </path>
                  <path>
                      <groupId>org.eclipse.persistence</groupId>
                      <artifactId>javax.persistence</artifactId>
                      <version>2.1.0</version>
                  </path>
                  <path>
                      <groupId>javax.inject</groupId>
                      <artifactId>javax.inject</artifactId>
                      <version>1</version>
                  </path>
                  <path>
                      <groupId>javax.annotation</groupId>
                      <artifactId>jsr250-api</artifactId>
                      <version>1.0</version>
                  </path>
              </annotationProcessorPaths>
          </configuration>
      </plugin>
      

      同时使用 QueryDSL 和 Lombok:

      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.7.0</version>
          <configuration>
              <annotationProcessors>
                  <annotationProcessor>lombok.launch.AnnotationProcessorHider$AnnotationProcessor</annotationProcessor>
                  <annotationProcessor>com.querydsl.apt.jpa.JPAAnnotationProcessor</annotationProcessor>
              </annotationProcessors>
              <annotationProcessorPaths>
                  <path>
                      <groupId>com.querydsl</groupId>
                      <artifactId>querydsl-core</artifactId>
                      <version>4.1.4</version>
                  </path>
                  <path>
                      <groupId>com.querydsl</groupId>
                      <artifactId>querydsl-apt</artifactId>
                      <version>4.1.4</version>
                  </path>
                  <path>
                      <groupId>com.mysema.codegen</groupId>
                      <artifactId>codegen</artifactId>
                      <version>0.6.8</version>
                  </path>
                  <path>
                      <groupId>org.eclipse.persistence</groupId>
                      <artifactId>javax.persistence</artifactId>
                      <version>2.1.0</version>
                  </path>
                  <path>
                      <groupId>javax.inject</groupId>
                      <artifactId>javax.inject</artifactId>
                      <version>1</version>
                  </path>
                  <path>
                      <groupId>javax.annotation</groupId>
                      <artifactId>jsr250-api</artifactId>
                      <version>1.0</version>
                  </path>
                  <path>
                      <groupId>org.projectlombok</groupId>
                      <artifactId>lombok</artifactId>
                      <version>1.16.22</version>
                  </path>
              </annotationProcessorPaths>
          </configuration>
      </plugin>
      

      【讨论】:

        【解决方案4】:

        改善答案或瑜伽士。这绝对有效,并且没有冗余

        <?xml version="1.0" encoding="UTF-8"?>
        <project...>
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.4.0</version>
                <relativePath/> <!-- lookup parent from repository -->
            </parent>
        
            <groupId>xxx</groupId>
            <artifactId>yyy</artifactId>
            <version>zzz</version>
        
            <properties>
                <java.version>11</java.version>
                <mapstruct.version>1.4.1.Final</mapstruct.version>
            </properties>
        
            <dependencies>
                ...
        
                <dependency>
                    <groupId>com.querydsl</groupId>
                    <artifactId>querydsl-jpa</artifactId>
                </dependency>
        
                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <optional>true</optional>
                </dependency>
        
                <dependency>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct</artifactId>
                    <version>${mapstruct.version}</version>
                </dependency>
        
            </dependencies>
        
            <build>
                <plugins>
                    ...
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <annotationProcessorPaths>
                                <path>
                                    <groupId>org.mapstruct</groupId>
                                    <artifactId>mapstruct-processor</artifactId>
                                    <version>${mapstruct.version}</version>
                                </path>
                                <path>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                    <version>${lombok.version}</version>
                                </path>
                                <path> <!-- Lombok made a special thing to better work with mapstruct -->
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok-mapstruct-binding</artifactId>
                                    <version>0.1.0</version>
                                </path>
                                <path>
                                    <groupId>com.querydsl</groupId>
                                    <artifactId>querydsl-apt</artifactId>
                                    <classifier>jpa</classifier>
                                    <version>${querydsl.version}</version>
                                </path>
                                <path>
                                    <groupId>javax.annotation</groupId>
                                    <artifactId>javax.annotation-api</artifactId>
                                    <version>${javax-annotation.version}</version>
                                </path>
                            </annotationProcessorPaths>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        
        </project>
        
        

        【讨论】:

          猜你喜欢
          • 2021-06-10
          • 2014-05-11
          • 1970-01-01
          • 1970-01-01
          • 2017-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-18
          相关资源
          最近更新 更多