Generación de metamodelo JPA2 a partir de un script de construcción de Gradle

Estoy tratando de configurar un script de construcción de Gradle para un nuevo proyecto. Ese proyecto usará JPA 2 junto con Querydsl .

En la siguiente página de la documentación de referencia de Querydsl , explican cómo configurar su JPAAnnotationProcessor (apt) para Maven y Ant.

Me gustaría hacer lo mismo con Gradle, pero no sé cómo y mi querido amigo no me ayudó mucho en este caso. Necesito encontrar una forma de invocar Javac (preferiblemente sin dependencias adicionales) con argumentos para poder especificar el procesador que apt debería usar (?)

No lo probé, pero esto debería funcionar:

repositories { mavenCentral() } apply plugin: 'java' dependencies { compile(group: 'com.mysema.querydsl', name: 'querydsl-apt', version: '1.8.4') compile(group: 'com.mysema.querydsl', name: 'querydsl-jpa', version: '1.8.4') compile(group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.6.1') } compileJava { doFirst { Map otherArgs = [ includeAntRuntime: false, destdir: destinationDir, classpath: configurations.compile.asPath, sourcepath: '', target: targetCompatibility, source: sourceCompatibility ] options.compilerArgs = [ '-processor', 'com.mysema.query.apt.jpa.JPAAnnotationProcessor', '-s', "${destinationDir.absolutePath}".toString() ] Map antOptions = otherArgs + options.optionMap() ant.javac(antOptions) { source.addToAntBuilder(ant, 'src', FileCollection.AntType.MatchingTask) options.compilerArgs.each {value -> compilerarg(value: value) } } } } 

Espero eso ayude.

Aunque no tengo ningún problema con el uso de gradle hace de Ant, estoy de acuerdo con el póster original que no es deseable en este caso. Encontré aquí un proyecto github de Tom Anderson que describe lo que creo que es un mejor enfoque. Lo modifiqué una pequeña cantidad para satisfacer mis necesidades (salida a src / main / generated) para que se vea así:

 sourceSets { generated } sourceSets.generated.java.srcDirs = ['src/main/generated'] configurations { querydslapt } dependencies { compile 'mine go here' querydslapt 'com.mysema.querydsl:querydsl-apt:2.7.1' } task generateQueryDSL(type: Compile, 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 

Este enfoque tiene mucho más sentido para mí que para el otro, si a usted también le interesa, entonces tiene otra opción para la generación de querydsl.

La esencia de este muchacho funcionó para mí: https://gist.github.com/EdwardBeckett/5377401

 sourceSets { generated { java { srcDirs = ['src/main/generated'] } } } configurations { querydslapt } dependencies { compile 'org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final' compile "com.mysema.querydsl:querydsl-jpa:$querydslVersion" querydslapt "com.mysema.querydsl:querydsl-apt:$querydslVersion" } 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') } } 

Aquí hay una configuración simple que funciona y se integra a la perfección con netbeans. Javac básicamente hará todo el trabajo necesario sin mucha intervención. El rest son pequeños tratamientos que lo harán funcionar con IDE como Netbeans.

 apply plugin:'java' dependencies { // Compile-time dependencies should contain annotation processors compile(group: 'com.mysema.querydsl', name: 'querydsl-apt', version: '1.8.4') compile(group: 'com.mysema.querydsl', name: 'querydsl-jpa', version: '1.8.4') compile(group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.6.1') } ext { generatedSourcesDir = file("${buildDir}/generated-sources/javac/main/java") } // This section is the key to IDE integration. // IDE will look for source files in both in both // // * src/main/java // * build/generated-sources/javac/main/java // sourceSets { main { java { srcDir 'src/main/java' srcDir generatedSourcesDir } } } // These are the only modifications to build process that are required. compileJava { doFirst { // Directory should exists before comstacktion started. generatedSourcesDir.mkdirs() } options.compilerArgs += ['-s', generatedSourcesDir] } 

Y eso es. Javac hará el rest del trabajo.

Con Gradle 1.3 y posterior (antiguo no probado) puede utilizar Querydsl APT de esta manera:

 configurations { javacApt } dependencies { javacApt 'com.mysema.querydsl:querydsl-apt:3.3.0' } compileJava { options.compilerArgs << '-processorpath' << (configurations.compile + configurations.javacApt).asPath << '-processor' << 'com.mysema.query.apt.jpa.JPAAnnotationProcessor' } 

Estos argumentos del comstackdor se pasan directamente a javac.

Para usar con el comstackdor groovy, reemplace compileJava con compileGroovy .

Para utilizar el generador de metamodelos JPA con Gradle, utilizo con éxito lo siguiente en mi build.gradle y funciona como un encanto:

 buildscript { ext {} repositories { // maven central & plugins.gradle.org/m2 } dependencies { // other dependencies, eg Spring classpath('gradle.plugin.at.comm_unity.gradle.plugins:jpamodelgen-plugin:1.1.1') } apply plugin: 'at.comm_unity.gradle.plugins.jpamodelgen' dependencies { compile('org.hibernate:hibernate-jpamodelgen:5.1.0.Final') } jpaModelgen { jpaModelgenSourcesDir = "src/main/java" } compileJava.options.compilerArgs += ["-proc:none"] } 

Dentro de la tarea de comstackción, se generan las clases de metamodelo estáticas con el sufijo ‘_’. Luego están ubicados en el mismo directorio que mis modelos @Entity.

El ejemplo de Querydsl Ant debería funcionar de la misma manera que cuando saca todo el XML. Entonces termina siendo algo como esto:

 javac -sourcepath ${src} -cp ${cp} -proc:only -processor com.mysema.query.apt.jpa.JPAAnnotationProcessor -s ${generated} 

src , cp y generated probablemente puedas extraer de Gradle.

    Intereting Posts