带有 QueryDSL 和 Gradle 的 IntelliJ 15
Posted
技术标签:
【中文标题】带有 QueryDSL 和 Gradle 的 IntelliJ 15【英文标题】:IntelliJ 15 with QueryDSL and Gradle 【发布时间】:2016-11-16 02:57:04 【问题描述】:我在 IntelliJ 15 中有一个 Spring-boot 1.4 项目,它使用 gradle 2.3 和 QueryDSL 4.1.3 无法构建,因为 Querydsl 没有将我的实体构建到 Q 类中。我有以下内容:
buildscript
ext
springBootVersion = '1.4.0.BUILD-SNAPSHOT'
querydslVersion = '4.1.3'
repositories
mavenCentral()
maven url "https://repo.spring.io/snapshot"
maven url "https://repo.spring.io/milestone"
maven url "https://plugins.gradle.org/m2/"
dependencies
classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.7"
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'eclipse'
apply plugin: 'spring-boot'
apply plugin: 'jacoco'
apply plugin: 'groovy'
apply plugin: "com.ewerk.gradle.plugins.querydsl"
jar
baseName = 'billing'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories
mavenCentral()
jcenter()
maven url "https://repo.spring.io/snapshot"
maven url "https://repo.spring.io/milestone"
maven url "https://repo.spring.io/libs-snapshot"
maven url "https://repo.spring.io/libs-snapshot"
maven url "https://plugins.gradle.org/m2/"
dependencies
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
compile "com.querydsl:querydsl-root:$querydslVersion"
compile "com.querydsl:querydsl-jpa:$querydslVersion"
compile "com.querydsl:querydsl-apt:$querydslVersion:jpa"
compile 'org.codehaus.groovy:groovy-all:2.4.1'
compile fileTree(dir: "libs/qbo-sdk-2.5.0", include: "*.jar")
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.spockframework:spock-core:1.0-groovy-2.4')
exclude group: 'org.codehaus.groovy', module: 'groovy-all'
testCompile('org.spockframework:spock-spring:1.0-groovy-2.4')
exclude group: 'org.spockframework', module: 'spock-core'
testCompile("junit:junit")
sourceSets
main
output.resourcesDir = output.classesDir
generated
java
srcDirs = ['src/main/generated']
querydsl
library = 'com.mysema.querydsl:querydsl-apt'
querydslDefault = true
test
reports.junitXml.destination = file('build/test-results/folder')
jacoco
toolVersion = "0.7.0.201403182114"
jacocoTestReport
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
configurations
querydslapt
task wrapper(type: Wrapper)
gradleVersion = '2.3'
idea
module
sourceDirs += file('generated/')
generatedSourceDirs += file('generated/')
当我运行单元测试时出现错误:
Caused by: java.lang.ClassNotFoundException: com.company.billing.customer.QCustomer
当我运行“gradle clean build”时,我得到: 找不到 com.mysema.querydsl:querydsl-apt:.
在以下位置搜索: https://repo1.maven.org/maven2/com/mysema/querydsl/querydsl-apt//querydsl-apt-.pom https://repo1.maven.org/maven2/com/mysema/querydsl/querydsl-apt//querydsl-apt-.jar https://jcenter.bintray.com/com/mysema/querydsl/querydsl-apt//querydsl-apt-.pom https://jcenter.bintray.com/com/mysema/querydsl/querydsl-apt//querydsl-apt-.jar https://repo.spring.io/snapshot/com/mysema/querydsl/querydsl-apt//querydsl-apt-.pom https://repo.spring.io/snapshot/com/mysema/querydsl/querydsl-apt//querydsl-apt-.jar https://repo.spring.io/milestone/com/mysema/querydsl/querydsl-apt//querydsl-apt-.pom https://repo.spring.io/milestone/com/mysema/querydsl/querydsl-apt//querydsl-apt-.jar https://repo.spring.io/libs-snapshot/com/mysema/querydsl/querydsl-apt//querydsl-apt-.pom https://repo.spring.io/libs-snapshot/com/mysema/querydsl/querydsl-apt//querydsl-apt-.jar
我意识到 QueryDsl 在 3 和 4 之间进行了一些包重构,但看起来我的依赖项似乎无法找到,即使它们显然在这里:https://mvnrepository.com/artifact/com.querydsl/querydsl-jpa/4.1.3
至少,这是我目前关于构建失败原因的理论。有人让最新的 spring、gradle 和 querydsl 工作了吗?
更新: 我删除了 ewerk 插件并简化了我的 build.gradle 文件,所以现在一切都可以正常构建了。我正在更新以帮助其他可能需要此功能的人:
buildscript
ext
springBootVersion = '1.4.0.BUILD-SNAPSHOT'
querydslVersion = '4.1.3'
repositories
mavenCentral()
maven url "https://repo.spring.io/snapshot"
maven url "https://repo.spring.io/milestone"
dependencies
classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'eclipse'
apply plugin: 'spring-boot'
apply plugin: 'jacoco'
apply plugin: 'groovy'
jar
baseName = 'billing'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories
mavenCentral()
jcenter()
maven url "https://repo.spring.io/snapshot"
maven url "https://repo.spring.io/milestone"
maven url "https://repo.spring.io/libs-snapshot"
maven url "https://repo.spring.io/libs-snapshot"
maven url "https://plugins.gradle.org/m2/"
dependencies
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
compile "com.querydsl:querydsl-root:$querydslVersion"
compile "com.querydsl:querydsl-jpa:$querydslVersion"
compile "com.querydsl:querydsl-apt:$querydslVersion:jpa"
compile 'org.codehaus.groovy:groovy-all:2.4.1'
compile fileTree(dir: "libs/qbo-sdk-2.5.0", include: "*.jar")
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.spockframework:spock-core:1.0-groovy-2.4')
exclude group: 'org.codehaus.groovy', module: 'groovy-all'
testCompile('org.spockframework:spock-spring:1.0-groovy-2.4')
exclude group: 'org.spockframework', module: 'spock-core'
testCompile("junit:junit")
test
reports.junitXml.destination = file('build/test-results/folder')
jacoco
toolVersion = "0.7.0.201403182114"
jacocoTestReport
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
task wrapper(type: Wrapper)
gradleVersion = '2.3'
idea
module
sourceDirs += file('generated/')
generatedSourceDirs += file('generated/')
【问题讨论】:
【参考方案1】:您是否看到在 Gradle 输出中生成了您的 QClass?从您的错误来看,它似乎已经过了应该生成它们的地步。
我认为问题在于您没有配置JPAAnnotationProcessor
。通过将 :jpa 附加到您的 querydsl-apt 依赖项,这是为了在 gradle 中方便。在 Maven 中,您应用插件 manually。
我的 build.gradle 中有以下与 querydsl 相关的内容。
idea
module
sourceDirs += file('generated/')
generatedSourceDirs += file('generated/')
[...]
compile "com.querydsl:querydsl-root:$querydslVersion"
compile "com.querydsl:querydsl-jpa:$querydslVersion"
compile "com.querydsl:querydsl-apt:$querydslVersion:jpa
idea 块只是在 IDEA 中自动配置生成的源目录,以便在 IDE 中构建正常工作。
编辑:
JPAAnnotationProcessor
输出如下所示。
Note: Running JPAAnnotationProcessor
Note: Serializing Supertypes
Note: Generating com.myclass.example.QMappedSuperClass for [com.myclass.example.MappedSuperClass]
Note: Serializing Entity types
Note: Generating com.myclass.example.QMyClass for [com.myclass.example.MyClass]
编辑:
我不熟悉 ewerk 插件,所以我看了一下。它似乎正在尝试为您激活 JPAAnnotationProcessor。您可能需要根据文档 here 设置 JPA 标志,因为它默认为 false。
请参阅有关依赖问题的评论线程。
编辑:对于Gradle 4.6+,您可以使用annotationProcessor
语法。
api "com.querydsl:querydsl-root:$querydslVersion"
api "com.querydsl:querydsl-jpa:$querydslVersion"
annotationProcessor "com.querydsl:querydsl-apt:$querydslVersion:jpa"
【讨论】:
在将您的更改添加到我的 gradle 文件之前或之后,我没有看到任何生成的类,但我仍然收到与Could not find com.mysema.querydsl:querydsl-apt:. Searched in the following locations:....
相同的错误
对不起。我错过了你的依赖错误。我不确定您为什么要尝试解决较旧的 com.mysema 版本。可以运行 gradlew 依赖并在依赖树中找到吗?
我以为我使用的是最新的 QueryDSL?因为我只是设置我的项目,QueryDSL 的唯一明确使用是com.mysema.query.types.Predicate
当我运行 gradlew 依赖项时,我仍然得到构建失败ould not resolve all dependencies for configuration 'detachedConfiguration5'. > Could not find com.mysema.querydsl:querydsl-apt
你为什么用com.mysema.query.types.Predicate
而不是com.querydsl.core.types.Predicate
?您的依赖项配置适用于 com.querydsl 组(版本 4+),而不是 com.mysema 组(版本 gradlew dependencies 而不是gradlew dependency
。即使没有找到您的依赖项,它也应该告诉您谁依赖于该 jar,然后您尝试更改它。您的构建文件还有更多内容吗?您正在导入 spring-boot-starter-test,但我没有看到任何其他 spring-boot 依赖项。
我用整个 build.gradle 文件更新了我的问题 - 希望它更有意义。我不能 com.querydsl.core.types.Predicate 因为找不到该依赖项 - 我想这突出了我的 querydsl 没有找到。我跑了gradlew dependencies
但它仍然失败Could not resolve all dependencies for configuration 'detachedConfiguration5'
我可以在mvnrepository 上查看querydsl 4.1.3 但gradle 似乎没有找到它?【参考方案2】:
如果有人想使用 Kotlin 和 Gradle kotlin dsl 执行此操作,请按照以下设置进行操作:
build.gradle.kts
plugins
[...]
id("org.jetbrains.kotlin.kapt") version kotlinVersion
dependencies
[...]
compile("com.querydsl:querydsl-core:$queryDslVersion")
compile("com.querydsl:querydsl-jpa:$queryDslVersion")
kapt("com.querydsl:querydsl-apt:$queryDslVersion:jpa")
请注意,在 Kotlin 1.2.20 中修复 Kapt 错误之前,您可能需要使用 Java 8 for Gradle。
【讨论】:
以上是关于带有 QueryDSL 和 Gradle 的 IntelliJ 15的主要内容,如果未能解决你的问题,请参考以下文章
QueryDSL:使用 Kotlin 和 Gradle 生成类失败
Java 11 + QueryDSL 4 + Gradle 5 + SpringBoot 2.1-不生成 QClasses