使用gradle进行常规的Querydsl代码生成

The*_*ect 5 groovy jpa gradle querydsl

我在groovy中定义了实体bean.我无法为groovy中的实体生成querydsl代码.

这个Gradle Querydsl配置适用于Java中的实体bean,但不适用于groovy.

参考关于替代代码生成的 Querydsl文档,它声明GenericExporter必须用于为groovy实体生成代码.但我无法弄清楚如何GenericExporter在gradle中配置.

如果有人能够使用gradle为groovy中的实体生成querydsl代码,请分享.

谢谢

Kos*_*ios 6

我今天想出了一个可行的解决方案.它结合了QueryDSL手册"基于类路径的代码生成"一章提供的信息和我在github上发现的一些"tasca"项目的构建脚本(非常感谢作者).

我在github上找到的构建脚本已针对Scala进行了调整,但经过一些修改我得到了它与groovy一起工作.我给你我整个build.gradle下面.这是一个非常新鲜的春季靴子项目.

请注意,我可以删除一些不是特定于问题的东西(比如jadira/joda库).我离开它们是为了明确你必须将它们作为项目的编译依赖项和buildcript依赖项包含在内.

这是因为Querydsl的GenericExporter需要与它扫描的编译类相关的所有内容,否则它将失败(嗯,它对我做了).

最后,我故意留下GenericExporter配置中使用的完全限定类名,这样我就不会用"import"语句污染整个构建脚本.

我的解决方案可能不是最好的,所以我愿意接受评论.目前,它的工作原理如下:

  1. 您运行./gradle compileGroovy以构建您手动编写的类(包括@Entity您在Groovy中编写的类
  2. 你运行./gradle generateQueryDSL哪个应该产生"Q"类src/main/generated
  3. 您最终./gradle compileGroovy再次运行以重新构建所有内容,这次包括之前生成的源generateQueryDSL.

我用gradle 1.11和2.1测试了它.我希望它对你也有用.



    //
    // Configure the build script itself
    //
    buildscript {
        ext {
            querydslGeneratedSourcesDir = file("src/main/generated")
            querydslInputEntityPackage = "my.project.domain"
            querydslVersion = "3.6.0"
            groovyVersion = "2.3.8"

            jadiraVersion = "3.2.0.GA"
            jodaTimeVersion = "2.6"
            jodaMoneyVersion = "0.10.0"

            hibernateJpaApiVersion = "1.0.0.Final"
        }

        repositories {
            mavenLocal()
            mavenCentral()
        }

        dependencies {
            // Load Spring Boot plugin
            classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.9.RELEASE")

            // Required by QueryDSL GenericExporter
            classpath("com.mysema.querydsl:querydsl-codegen:${querydslVersion}")
            classpath("org.hibernate.javax.persistence:hibernate-jpa-2.1-api:${hibernateJpaApiVersion}")

            classpath files("${buildDir}/classes/main")
            classpath("org.jadira.cdt:cdt:${jadiraVersion}")
            classpath("joda-time:joda-time:${jodaTimeVersion}")
            classpath("org.joda:joda-money:${jodaMoneyVersion}")
        }
    }

    apply plugin: 'java'
    apply plugin: 'groovy'
    apply plugin: 'eclipse'
    apply plugin: 'idea'
    apply plugin: 'spring-boot'

    //
    // Make both java and groovy files visible only to the Groovy Compiler plugin
    //
    sourceSets {
        main {
            java {
                srcDirs = []
            }
            groovy {
                srcDirs = ['src/main/java', querydslGeneratedSourcesDir]
            }
        }
        test {
            java {
                srcDirs = []
            }
            groovy {
                srcDirs = ['src/test/java']
            }
        }
    }

    task generateQueryDSL(group: 'build', description: 'Generate QueryDSL query types from compiled entity types') {
        new com.mysema.query.codegen.GenericExporter().with {
            setKeywords(com.mysema.query.codegen.Keywords.JPA)
            setEntityAnnotation(javax.persistence.Entity.class)
            setEmbeddableAnnotation(javax.persistence.Embeddable.class)
            setEmbeddedAnnotation(javax.persistence.Embedded.class)
            setSupertypeAnnotation(javax.persistence.MappedSuperclass.class)
            setSkipAnnotation(javax.persistence.Transient.class)
            setTargetFolder(querydslGeneratedSourcesDir)
            export(querydslInputEntityPackage)
        }
    }

    //
    // Configure spring boot plugin
    //
    bootRepackage {
        mainClass = 'my.project.Application'
    }

    jar {
        baseName = 'gs-spring-boot'
        version = '0.1.0'
    }

    repositories {
        mavenLocal()
        mavenCentral()
    }

    dependencies {
        compile("org.springframework.boot:spring-boot-starter-web")
        // tag::actuator[]
        compile("org.springframework.boot:spring-boot-starter-actuator")
        // end::actuator[]
        compile("org.springframework.boot:spring-boot-starter-data-jpa")
    //    compile("org.springframework.boot:spring-boot-starter-security")

        compile("mysql:mysql-connector-java:5.1.34")
        compile("org.codehaus.groovy:groovy-all:${groovyVersion}")
        compile("cz.jirutka.spring:spring-rest-exception-handler:1.0.1")

        compile("com.mysema.querydsl:querydsl-core:${querydslVersion}")

        // Joda & Jadira types
        compile("joda-time:joda-time:${jodaTimeVersion}")
        compile("org.joda:joda-money:${jodaMoneyVersion}")
        compile("org.jadira.usertype:usertype.extended:${jadiraVersion}")
        compile("org.jadira.cdt:cdt:${jadiraVersion}")
        compile("com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.4")

        // Testing
        testCompile("junit:junit")
        testCompile("org.springframework.boot:spring-boot-starter-test")
    }

    // Configure the gradle wrapper
    task wrapper(type: Wrapper) {
        gradleVersion = '2.1'
    }
Run Code Online (Sandbox Code Playgroud)