我们正在使用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被执行,这可以在构建过程失败之前看到:
[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
的摘录
<?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;
^
发布于 2018-08-30 20:50:05
这是一个老问题,但这是我如何找到我的解决方案的,为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>
发布于 2018-06-02 03:03:53
我宁愿只在数据库发生变化时使用profile来生成这些Qclasses。
缺点:
当您不更改数据库模式时,拉取请求中的-your比较是干净的,因为对于每一代,由于某些原因(至少在我的例子中是这样),这些文件往往生成不同的结果。
-you可以管理数据库中的哪些表将具有Qclasses (有时在更改数据库模式后忘记重新生成它们是一件痛苦的事情)。
-well并不是说它有很多时间。但是,如果您不更改模式并且关闭配置文件,则构建速度会更快。
尝试这样做,当您想要生成更改的模式Qclasses时,打开profile:
<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>
发布于 2018-06-06 22:05:48
生成的源目录不会自动包含在jar中。
您需要使用Maven构建助手插件来修复此问题,例如:
https://github.com/alexec/javahelp-skeleton/blob/master/pom.xml
https://stackoverflow.com/questions/50608356
复制相似问题