QueryDSL、spring-boot 和 Gradle

Posted

技术标签:

【中文标题】QueryDSL、spring-boot 和 Gradle【英文标题】:QueryDSL, spring-boot & Gradle 【发布时间】:2014-05-11 12:06:07 【问题描述】:

我希望通过 gradle 将 querydsl 带入我的 spring-boot 项目。尽管在网上找到了几个例子,但由于依赖关系的问题(我认为),它们实际上都不适合我。根据 QueryDSL 支持论坛,尚不支持 gradle。但是我想知道是否有人已经成功创建了所有 gradle 和 spring-boot ?

这是我的 build.gradle:

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'jacoco'
apply plugin: 'war'

buildscript 
    repositories 
        maven  url "http://repo.spring.io/libs-snapshot" 
        mavenLocal()
    
    dependencies 
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC4")
    


repositories 
    mavenCentral()
    maven  url: "http://repo.spring.io/libs-snapshot" 
//    maven  url: "http://repo.spring.io/milestone" 



dependencies 
    compile("org.springframework.boot:spring-boot-starter-web:1.0.0.RC5")
    compile("org.springframework.boot:spring-boot-starter-data-jpa:1.0.0.RC5")
    compile("org.springframework:spring-orm:4.0.0.RC1")
    compile("org.hibernate:hibernate-entitymanager:4.2.1.Final")
    compile("com.h2database:h2:1.3.172")
    compile("joda-time:joda-time:2.3")
    compile("org.thymeleaf:thymeleaf-spring4")
    compile("org.codehaus.groovy.modules.http-builder:http-builder:0.7.1")
    compile('org.codehaus.groovy:groovy-all:2.2.1')
    compile('org.jadira.usertype:usertype.jodatime:2.0.1')

    // this line fails
    querydslapt "com.mysema.querydsl:querydsl-apt:3.3.2"

    testCompile('org.spockframework:spock-core:0.7-groovy-2.0') 
        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
    
    testCompile('org.codehaus.groovy.modules.http-builder:http-builder:0.7+')
    testCompile("junit:junit")


jacocoTestReport 
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."


task wrapper(type: Wrapper) 
    gradleVersion = '1.11'



sourceSets 
    main 
        generated 
            java 
                srcDirs = ['src/main/generated']
            
        

        java 
            srcDirs = []
        
        groovy 
            srcDirs = ['src/main/groovy', 'src/main/java']
        
        resources 
            srcDirs = ['src/main/resources']
        

        output.resourcesDir = "build/classes/main"
    

    test 
        java 
            srcDirs = []
        
        groovy 
            srcDirs = ['src/test/groovy', 'src/test/java']
        
        resources 
            srcDirs = ['src/test/resources']
        

        output.resourcesDir = "build/classes/test"
    



configurations 
    // not really sure what this is, I see it in examples but not in documentation
    querydslapt


task generateQueryDSL(type: JavaCompile, group: 'build', description: 'Generates the QueryDSL query types') 
    source = sourceSets.main.java
    classpath = configurations.compile + configurations.querydslapt
    options.compilerArgs = [
            "-proc:only",
            "-processor", "com.mysema.query.apt.jpa.JPAAnnotationProcessor"
    ]
    destinationDir = sourceSets.generated.java.srcDirs.iterator().next()


compileJava 
    dependsOn generateQueryDSL
    source generateQueryDSL.destinationDir


compileGeneratedJava 
    dependsOn generateQueryDSL
    options.warnings = false
    classpath += sourceSets.main.runtimeClasspath


clean 
    delete sourceSets.generated.java.srcDirs


idea 
    module 
        sourceDirs += file('src/main/generated')
    

但是 gradle 失败了:

Could not find method querydslapt() for arguments [com.mysema.querydsl:querydsl-apt:3.3.2] 

我尝试将 querydsl-apt 版本更改为早期版本,但我得到了同样的错误。

【问题讨论】:

请问您是从哪里复制的编译配置?它有几个错误,最好找到源并在那里修复它。 我在这里 (gist.github.com/EdwardBeckett/5377401)、这里 (***.com/questions/6431026/…) 和 querydsl 支持论坛找到了示例。 【参考方案1】:

Spring Boot 1.3.5 的工作配置和支持的 QueryDSL,用 gradle 2.14 测试。

ext 
    queryDslVersion = '3.6.3'
    javaGeneratedSources = file("$buildDir/generated-sources/java")


compileJava 
    doFirst 
        javaGeneratedSources.mkdirs()
    
    options.compilerArgs += [
            '-parameters', '-s', javaGeneratedSources
    ]


dependencies 
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile "com.mysema.querydsl:querydsl-jpa:$queryDslVersion"

    compileOnly "com.mysema.querydsl:querydsl-apt:$queryDslVersion:jpa"

完整的项目源码:spring-boot-querydsl

【讨论】:

【参考方案2】:

你可能至少需要做两件事:

    在使用之前声明“querydslapt”配置

    将 querydsl-jpa(或您需要的任何类型)添加到您的“编译”配置中。

然后您将设置类路径,但是如果没有更多配置,apt 位将不会做任何事情(您从 querydsl 支持论坛毫无疑问地发现)。 apt but 用于生成一些代码,然后您需要在应用程序代码中编译和使用这些代码(与您的域对象相对应的“Q*”类)。你可以通过我想象的 gradle 中的构建任务来驱动它(它只需要为域对象的每次更改运行一次)。

【讨论】:

感谢戴夫一直以来的帮助。我仍在为此苦苦挣扎,因为我仍然不太了解 gradle。我会靠边站,看看我能不能更好地教育自己。同时,我将在我的项目中传递 querydsl。

以上是关于QueryDSL、spring-boot 和 Gradle的主要内容,如果未能解决你的问题,请参考以下文章

为sql视图构建一个Q对象

是否可以结合 MyBatis 和 QueryDSL/jOOQ?

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

Spring Data JPA - 规范和 Querydsl

比较 Querydsl、jOOQ、JEQUEL、activejdbc、iciql 和其他查询 DSL

Maven 使用 spring-data-jpa 和 querydsl 构建问题