我们正在使用Spring Boot,Hibernate,Query DSL和Maven with Java 1.8的设置
最近,我已使用下面列出的配置将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
类的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项目设置的配置:
这是控制台中显示的错误消息:
[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;
^
答案 0 :(得分: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 :(得分:1)
我宁愿仅在发生db更改时使用profile来生成这些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>
答案 2 :(得分:0)
生成的源目录不会自动包含在jar中。
您需要使用Maven构建帮助程序插件来解决此问题,例如:
https://github.com/alexec/javahelp-skeleton/blob/master/pom.xml
答案 3 :(得分:0)
你可以尝试一些事情:
1.将<clearOutputDir>false</clearOutputDir>
放入configuration
标记中
2.有时在编译阶段之前可能没有生成类。因此,请尝试将相位添加到插件中
<execution>
<phase>generate-sources</phase>
<goals>
<goal>...</goal>
</goals>
</execution>
答案 4 :(得分: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>