首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >查询DSL & Maven:没有生成类,但只在命令行上生成(在eclipse中它工作得很好)

查询DSL & Maven:没有生成类,但只在命令行上生成(在eclipse中它工作得很好)
EN

Stack Overflow用户
提问于 2018-05-30 23:22:32
回答 5查看 7.8K关注 0票数 7

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

最近,我使用下面列出的配置将查询DSL添加到项目中。要使其正常工作,我必须在eclipse项目设置中配置Java Compiler以允许注释处理,并将Query DSL .jar文件添加到eclipse Annotation Factory路径中。

此设置按预期工作。它生成了定制的Q类,我可以在我的代码中使用它们。现在在命令行上运行mvn clean install时,我的代码中的每个类都会抛出错误cannot find symbol,因为缺少该类。为了使构建过程正常工作,我还需要配置其他什么东西吗?

EDIT:这个问题不是this question的重复,因为我没有问为什么会发生这个错误(找不到符号),而是问如何配置QueryDSL使其也能在命令行上工作。

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

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

代码语言:javascript
复制
[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类得到了正确的编译。它们应该以.class文件的形式出现在target文件夹中。会不会是Q类编译得太晚了?

这里的 pom.xml的摘录

代码语言:javascript
复制
<?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项目设置的配置:

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

代码语言:javascript
复制
[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;
^
EN

回答 5

Stack Overflow用户

发布于 2018-08-30 20:50:05

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

代码语言:javascript
复制
    <!-- 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:

代码语言:javascript
复制
<!-- 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>
票数 3
EN

Stack Overflow用户

发布于 2018-06-02 03:03:53

我宁愿只在数据库发生变化时使用profile来生成这些Qclasses。

缺点:

当您不更改数据库模式时,拉取请求中的-your比较是干净的,因为对于每一代,由于某些原因(至少在我的例子中是这样),这些文件往往生成不同的结果。

-you可以管理数据库中的哪些表将具有Qclasses (有时在更改数据库模式后忘记重新生成它们是一件痛苦的事情)。

-well并不是说它有很多时间。但是,如果您不更改模式并且关闭配置文件,则构建速度会更快。

尝试这样做,当您想要生成更改的模式Qclasses时,打开profile:

代码语言:javascript
复制
<properties>
    <whitelisted.tables>
        user_accunt,
        other
    </whitelisted.tables>
</properties>
<profiles>
    <profile>
        <id>generate</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>com.querydsl</groupId>
                    <artifactId>querydsl-maven-plugin</artifactId>
                    <version>${querydsl.version}</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>export</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <jdbcDriver>org.postgresql.Driver</jdbcDriver>
                        <jdbcUrl>jdbc:postgresql://localhost:port/dbname</jdbcUrl>
                        <packageName>your.package.name.for.q</packageName>
                        <jdbcUser>dbusername</jdbcUser>
                        <jdbcPassword>dbpassword</jdbcPassword>
                        <targetFolder>${project.basedir}/src/main/java/</targetFolder>
                        <spatial>true</spatial>
                        <tableNamePattern>${whitelisted.tables}</tableNamePattern>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.postgresql</groupId>
                            <artifactId>postgresql</artifactId>
                            <version>42.1.1</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
票数 1
EN

Stack Overflow用户

发布于 2018-06-06 22:05:48

生成的源目录不会自动包含在jar中。

您需要使用Maven构建助手插件来修复此问题,例如:

https://github.com/alexec/javahelp-skeleton/blob/master/pom.xml

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50608356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档