잊지 않겠습니다.

queryDSL을 이용한 java project의 경우에는 gradle로는 조금 과정이 복잡하게 됩니다. 

queryDSL의 경우에는 pre-compile 과정이라고 해서, 기존의 domain entity 들을 이용한 Q class들을 생성해야지 됩니다.
이런 Q class들을 생성하는 build 과정을 먼저 거친 다음에, 기존의 class들을 compile시키는 과정을 거쳐야지 됩니다. 

따라서, compileJava보다 먼저 선행되는 작업이 반드시 필요하게 됩니다. 

먼저, generate될 code가 위치할 곳을 지정해줍니다. 

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

그리고, 새로운 task를 생성시켜줍니다. 
task generateQueryDSL(type: JavaCompile, group: 'build') {
     source = sourceSets.main.java
     classpath = configurations.compile
     options.compilerArgs = [
          "-proc:only",
          "-processor", "com.mysema.query.apt.jpa.JPAAnnotationProcessor"
     ]
     destinationDir = sourceSets.generated.java.srcDirs.iterator().next()
}

위 코드는 compile type의 code라는 것을 먼저 생성시켜주고, 원 source와 Q code를 생성해주는 pre processor를 지정해주는 코드입니다. 마지막줄에서 code를 어느곳에 생성할지를 결정하고 있습니다.
그리고, compileJava에 종속성을 주입해야지 됩니다. 기존에 java plugin을 사용하고 있기 때문에, task를 새로 생성하는 것이 아닌 overwrite 시키는 개념으로 접근하면 됩니다. 

compileJava {
     dependsOn generateQueryDSL
     source generateQueryDSL.destinationDir
}
compileGeneratedJava {
     dependsOn generateQueryDSL
     options.warnings = false
     classpath += sourceSets.main.runtimeClasspath
}

이 두 task를 통해서, 기존의 compileJava의 경우 반드시 generateQueryDSL task를 실행 후, 동작하게 되고 source는 generateQueryDSL.destinationDir을 참고해서 compile을 행하게 됩니다. 또한 compileGeneratedJava task 역시 generateQueryDSL task를 실행하고, compile 된 객체들을 같이 이용해서 jar를 만들어주는 cycle을 통하게 됩니다. 


마지막으로, project를 모두 clean 시키기 위한 코드 역시 수정이 필요합니다. generated 되는 코드들도 같이 지워주기 위해서는 clean task를 다음과 같이 재정의하는 것이 좋습니다. 

clean {
     delete sourceSets.generated.java.srcDirs
}

다음은 build.gradle 파일의 전체입니다. 참고해보시길 바랍니다. 

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

dependencies {
    def querydslVersion = '3.2.4'
    def slf4jVersion = "1.7.2"

    def queryDSL = '3.2.4'
    compile project(':common')
    compile group: 'mysql', name: 'mysql-connector-java', version:'5.1.22'
    compile group: 'com.jolbox', name: 'bonecp', version:'0.7.1.RELEASE'
    compile group: 'com.google.guava', name: 'guava', version:'14.0'
    compile group: 'org.springframework', name: 'spring-core', version:'3.2.3.RELEASE'
    compile group: 'org.springframework', name: 'spring-orm', version:'3.2.3.RELEASE'
    compile group: 'org.springframework', name: 'spring-tx', version:'3.2.3.RELEASE'
    compile group: 'org.springframework', name: 'spring-context', version:'3.2.3.RELEASE'
    compile group: 'org.springframework', name: 'spring-context-support', version:'3.2.3.RELEASE'
    compile group: 'org.hibernate', name: 'hibernate-core', version:'4.1.10.Final'
    compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.0-api', version:'1.0.1. Final'
    compile group: 'org.hibernate', name: 'hibernate-entitymanager', version:'4.1.10.Final'
    compile group: 'org.hibernate', name: 'hibernate-validator', version:'4.3.1.Final'

    compile group: 'org.springframework.data', name: 'spring-data-jpa', version:'1.4.2.RELEASE'

    compile group: 'com.mysema.querydsl', name: 'querydsl-core', version:"$queryDSL"
    compile group: 'com.mysema.querydsl', name: 'querydsl-jpa', version:"$queryDSL"
    compile group: 'com.mysema.querydsl', name: 'querydsl-sql', version:"$queryDSL"

    compile "com.mysema.querydsl:querydsl-apt:$queryDSL"
    provided 'org.projectlombok:lombok:0.12.0'

    compile "org.slf4j:jcl-over-slf4j:$slf4jVersion"
    compile "org.slf4j:jul-to-slf4j:$slf4jVersion"

    provided "com.mysema.querydsl:querydsl-apt:$querydslVersion"
    provided 'org.projectlombok:lombok:0.12.0'
}

task generateQueryDSL(type: JavaCompile, group: 'build', description: 'Generates the QueryDSL query types') {
    source = sourceSets.main.java
    classpath = configurations.compile + configurations.provided
    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 build를 실행하면 이제 Q class들이 모두 compile 되고, jar 안에도 역시 Q class들이 모두 위치한 것을 알 수 있습니다. 



Posted by Y2K
,