查询DSL和Maven:类没有生成,但只在命令行上(在eclipse中工作正常)

问题描述 投票:7回答:5

我们正在使用Spring Boot,Hibernate,Query DSL和Maven与Java 1.8的设置

最近,我使用下面列出的配置将Query DSL添加到项目中。为了使其工作,我必须在eclipse项目设置中配置Java Compiler以允许Annotation Processing,并将Query DSL .jar文件添加到eclipse Annotation Factory Path。

此设置按预期工作。它生成了自定义的Q类,我可以在我的代码中使用它们。当现在在命令行上运行mvn clean install时,我的代码中的每个类都会抛出错误cannot find symbol,因为缺少该类。还有什么我需要配置 - 类似于eclipse设置中的.jar文件 - 使构建过程有效吗?

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

编辑2:我现在尝试集成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: [...]

编辑3:当我删除每个引用Q类的import语句时,构建过程会经历(显然)。然而,值得注意的是,在这种情况下,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;
^
java maven querydsl
5个回答
2
投票

这是一个老问题,但这是我找到我的解决方案,为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>

1
投票

我宁愿使用profile只在发生db更改时才生成这些Qclasses。

缺点:

- 当您不更改数据库模式时,拉请求中的差异是干净的,因为对于每一代,这些文件由于某种原因(在我的情况下至少)会产生不同的生成。

- 你可以管理你的数据库中存在的表的女巫将有Qclasses(有时当你在更改数据库模式后忘记重新生成它们时会很痛苦)

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

尝试这样的事情并在想要生成更改的模式Qclasses时打开配置文件:

<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>

0
投票

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

您需要使用Maven构建帮助程序插件来解决此问题,例如:

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


0
投票

你可以尝试一些事情: 1.将<clearOutputDir>false</clearOutputDir>放入你的configuration标签 2.有时在编译阶段之前可能没有生成类。因此,请尝试在您的插件中添加相位

   <execution>
        <phase>generate-sources</phase>
        <goals>
            <goal>...</goal>
        </goals>
    </execution>


0
投票

按照惯例,Maven假定所有源代码都在'src / main / java'中,编译它并将所有* .class文件放在目标中。

因此,如果您在Alien.java中有一个类'<project-root>/alice/in/wonderland',您将无法访问它(在src / main / java中),因为maven将src/main/java中的所有内容放在类路径中用于编译器,因此编译器不知道任何源代码( * .java)其他任何地方。

在您的情况下,您将在目录target/generated-sources/java中生成源代码,因此您必须告诉maven。正如在其他一些答案中所提到的,你可以使用build-helper-plugin,让maven知道你的源代码位于target/generated-sources/java

 <project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>target/generated-sources/java</source>
                <source>alice/in/wonderland</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

编辑:您在build-helper-plugin中提到了错误的路径

我看到虽然您使用的是构建帮助程序插件,但您使用的是错误的路径

 --- build-helper-maven-plugin:1.9.1:add-source (add-source) @ project1 ---
[INFO] Source directory: C:\Users\user1\git\project1\src\main\generated added.

而不是src\main\generated你应该使用<source>target/generated-sources/java</source>

© www.soinside.com 2019 - 2024. All rights reserved.