带有 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、spring-boot 和 Gradle

QueryDSL:使用 Kotlin 和 Gradle 生成类失败

QueryDSL 注释处理器和 gradle 插件

QueryDSL 与注解处理器的 Gradle 配置

Java 11 + QueryDSL 4 + Gradle 5 + SpringBoot 2.1-不生成 QClasses

Querydsl mongodb gradle springboot问题