java - 查询 DSL & Maven : Classes not generated, 但仅在命令行上(在 Eclipse 中它工作正常)

标签 java maven querydsl

我们正在使用带有 Java 1.8 的 Spring Boot、Hibernate、Query DSL 和 Maven 的设置

最近,我使用下面列出的配置将 Query DSL 添加到项目中。为了让它工作,我必须在 eclipse 项目设置中配置 Java 编译器以允许注释处理,并将查询 DSL .jar 文件添加到 eclipse 注释工厂路径。

此设置按预期工作。它生成了自定义 Q 类,我可以在我的代码中使用它们。现在在命令行上运行 mvn clean install 时,我的代码中的每个类都会抛出错误 cannot find symbol,因为类丢失了。是否还有其他我需要配置的东西 - 类似于 eclipse 设置中的 .jar 文件 - 以使构建过程正常运行?

编辑: 这个问题不是 this question 的重复问题因为我没有问为什么会出现这个错误(找不到符号),而是问如何配置 QueryDSL 也可以在命令行上工作。

EDIT2:我现在尝试集成 build-helper-maven-plugin 以使用多个源路径作为输入。这也没有帮助。我还尝试将文件生成到 src 文件夹中。它也没有帮助。

当我第一次在 eclipse 中编译库时,mvn compile 在命令行上通过,但是 mvn clean compile 仍然失败,因为它只使用编译后的文件再次发生 eclipse 。 apt-maven-plugin 被执行,在构建过程失败之前可以看到:

[INFO] --- apt-maven-plugin:1.1.3:process (default) @ project1 ---
[INFO]
[INFO] --- build-helper-maven-plugin:1.9.1:add-source (add-source) @ project1 ---
[INFO] Source directory: C:\Users\user1\git\project1\src\main\generated added.
[INFO]
[INFO] --- maven-processor-plugin:2.2.4:process (process) @ project1 ---
[ERROR] diagnostic: [...]

EDIT3: 当我删除每个引用 Q 类的导入语句时,构建过程(显然)完成。然而,值得注意的是,在这种情况下,Q 类得到了正确的编译。它们在 target 文件夹中显示为 .class 文件。会不会是 Q 类编译得太晚了?


这是 pom.xml

的摘录
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    [...]
    <prerequisites>
        <maven>3.0.0</maven>
    </prerequisites>

    <dependencies>
        [...]
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>4.1.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>4.1.3</version>
        </dependency>
    </dependencies>

    <build>
        <defaultGoal>spring-boot:run</defaultGoal>
        <plugins>
            [...]
            <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>
        </plugins>
        [...]
    </build>
</project>

这是eclipse项目设置的配置:

enter image description here

这是控制台中显示的错误消息:

[INFO] --- maven-processor-plugin:2.2.4:process (process) @ project1 ---
[ERROR] diagnostic: C:\Users\user1\git\project1\src\main\java\com\project1\repository\UserRepositoryImpl.java:3: error: cannot find symbol
import static com.project1.domain.QUser.user;
                                     ^
  symbol:   class QUser
  location: package com.project1.domain

[ERROR] diagnostic: C:\Users\user1\git\project1\src\main\java\com\project1\repository\UserRepositoryImpl.java:3: error: static import only from classes and interfaces
import static com.project.domain.QUser.user;
^

最佳答案

这是一个老问题,但这是我找到解决方案的方式,为 jpa 依赖项添加了分类器:

    <!-- BEGIN: 'querydsl-jpa' -->
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${querydsl-jpa.version}</version>
        <classifier>apt</classifier>
    </dependency>
    <!-- END: 'querydsl-jpa' -->

我的完整 pom:

<!-- BEGIN: BUILD -->
<build>

    <!-- BEGIN: PLUGINS -->
    <plugins>

        <!-- BEGIN: apt-maven-plugin -->
        <plugin>
            <groupId>com.mysema.maven</groupId>
            <artifactId>apt-maven-plugin</artifactId>
            <version>${apt.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>process</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/generated-sources/apt</outputDirectory>
                        <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- END: apt-maven-plugin -->

    </plugins>
    <!-- END: PLUGINS -->

</build>
<!-- END: BUILD -->

<!-- BEGIN: DEPENDENCIES -->
<dependencies>

    <!-- *********************************************** -->
    <!-- BEGIN: 'QUERYDSL DEPENDENCIES'                  -->

    <!-- BEGIN: 'querydsl-apt' -->
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>${querydsl-apt.version}</version>
    </dependency>
    <!-- END: 'querydsl-apt' -->

    <!-- BEGIN: 'querydsl-jpa' -->
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${querydsl-jpa.version}</version>
        <classifier>apt</classifier>
    </dependency>
    <!-- END: 'querydsl-jpa' -->

    <!-- *********************************************** -->
    <!-- END: 'QUERYDSL DEPENDENCIES'                    -->


</dependencies>

关于java - 查询 DSL & Maven : Classes not generated, 但仅在命令行上(在 Eclipse 中它工作正常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50608356/

相关文章:

java - QueryDsl SpringData Jpa findAll 如何避免count()

java - 不幸的是,APP已停止 - Android Twitter客户端

java - 如何一次将单个数字读取为单个字符而不是字母

java - 如何以编程方式启动 Apache Cassandra

java - Maven 和 JOGL 库?

java - Maven 使用 spring-data-jpa 和 querydsl 构建问题

java - 尝试访问 JavaBean 时引发的异常

maven - spectj-maven-编译器插件 : how to weave JRE System. *?

java - 尝试使用 flink Kafka Consumer 消费时出现错误 "java.lang.NoSuchMethodError: org.apache.kafka.clients.consumer.KafkaConsumer.assign"

elasticsearch - Elastic Search 5.6中的嵌套查询兼容性