Создание метамодели JPA2 из сборки Gradle script
Я пытаюсь создать Gradle build script для нового проекта. Этот проект будет использовать JPA 2 вместе с Querydsl.
На на следующей странице справочной документации Querydsl они объясняют, как настроить свой JPAAnnotationProcessor (apt) для Maven и Ant.
Я хотел бы сделать то же самое с Gradle, но я не знаю, как и мой любимый друг не очень помог мне в этом. Мне нужно найти способ вызвать Javac (желательно без каких-либо дополнительных зависимостей) с аргументами, чтобы иметь возможность указать процессор, который apt должен использовать (?)
Ответы
Ответ 1
Я не тестировал его, но это должно работать:
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)
}
}
}
}
Надеюсь, что это поможет.
Ответ 2
В то время как у меня нет проблем с использованием gradle делает из Ant, я согласен с оригинальным плакатом, что в этом случае нежелательно. Я нашел проект github Тома Андерсона здесь, который описывает то, что, по моему мнению, является лучшим подходом. Я изменил его на небольшое количество, чтобы соответствовать моим потребностям (вывод на src/main/сгенерирован), чтобы он выглядел следующим образом:
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
Этот подход имеет для меня гораздо больше смысла, чем другой, если он вам тоже подходит, тогда у вас есть еще один вариант генерации querydsl.
Ответ 3
Этот парень работал у меня: 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')
}
}
Ответ 4
С Gradle 1.3 и более новыми (более старыми не проверенными) вы можете использовать Querydsl APT следующим образом:
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'
}
Эти аргументы компилятора передаются непосредственно в javac.
Для использования с groovy компилятором замените compileJava
на compileGroovy
.
Ответ 5
Вот простая настройка, которая работает и легко интегрируется с netbeans. Javac будет выполнять всю необходимую работу без особого вмешательства. Остальные - небольшие штрихи, которые заставят его работать с IDE, например 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 compilation started.
generatedSourcesDir.mkdirs()
}
options.compilerArgs += ['-s', generatedSourcesDir]
}
И что это. Javac выполнит оставшуюся часть работы.
Ответ 6
Чтобы использовать генератор метамодели JPA с Gradle, я успешно использую следующее в моем build.gradle и работает как прелесть:
buildscript {
ext {}
repositories { // maven central & plugins.gradle.org/m2 }
dependencies {
// other dependencies, e.g. 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"]
}
В рамках задачи построения генерируются статические классы метамодели с суффиксом '_'. Впоследствии они расположены в том же каталоге, что и мои модели @Entity.
Ответ 7
Пример Querydsl Ant должен работать почти так же, как при извлечении всего XML. Таким образом, это заканчивается тем, что выглядит следующим образом:
javac -sourcepath ${src} -cp ${cp} -proc:only -processor com.mysema.query.apt.jpa.JPAAnnotationProcessor -s ${generated}
src
, cp
и generated
вы, вероятно, сможете извлечь из Gradle.