Создание метамодели JPA2 из скрипта сборки Gradle

Я пытаюсь настроить скрипт сборки Gradle для нового проекта. В этом проекте будет использоваться JPA 2 вместе с Querydsl.

На следующей странице справочной документации Querydsl, они объясняют, как настроить свой JPAAnnotationProcessor (apt) для Maven и Ant.

Я хотел бы сделать то же самое с Gradle, но я не знаю, как, и мой любимый друг не очень помог мне в этом. Мне нужно найти способ вызвать Javac (желательно без каких-либо дополнительных зависимостей) с аргументами, чтобы иметь возможность указать процессор, который должен использовать apt (?)


person dSebastien    schedule 21.06.2011    source источник


Ответы (7)


Я не тестировал, но это должно сработать:

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)
            }
        }
    }
}

Надеюсь, поможет.

person Fred Simon    schedule 22.06.2011
comment
Разве ваше решение не добавляет в сборку зависимость от ant? Я бы хотел этого избежать, если возможно - person dSebastien; 23.06.2011
comment
Ant - вот как строит Gradle. Он находится в ядре Gradle, поэтому никаких зависимостей не требуется. Рад знать, что это сработало. - person Fred Simon; 23.06.2011
comment
Приятно знать, это научит меня RTFM, прежде чем я буду комментировать ;-) Еще раз спасибо. - person dSebastien; 23.06.2011
comment
gradle - это муравей, но в Groovy вместо xml. - person MariuszS; 21.01.2015

Хотя у меня нет проблем с использованием Gradle Ant, я согласен с исходным постером, что в данном случае это нежелательно. Я нашел здесь проект github Тома Андерсона, который описывает то, что я считаю лучшим подходом. Я немного изменил его, чтобы он соответствовал моим потребностям (вывод в src / main / generated), чтобы он выглядел так:

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.

person JoeG    schedule 23.08.2012
comment
спасибо, Джоэг: Мне нравится, что этап генерации исходного кода и этап компиляции кода разделены :) - person pbanfi; 12.03.2013
comment
Спасибо! это выполнило свою работу для m, но мне пришлось заменить type: Compile на type: JavaCompile - person Iuliana Cosmina; 26.04.2017

Суть этого парня сработала для меня: 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')
    }
}
person Ryan Walls    schedule 23.08.2013
comment
Я использую Gradle 1.10, и это сработало отлично! Спасибо @Ryan. - person Yohan Liyanage; 19.06.2014

Вот простая установка, которая работает и легко интегрируется с 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.

person Victor Nazarov    schedule 22.04.2014
comment
Отлично! Это то, что я искал! - person MariuszS; 20.06.2016

С 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.

person Pavel Černocký    schedule 15.01.2013
comment
Привет, Павел! Я попробовал решение, которое вы предлагаете для моих сущностей (написанных на Groovy), но оно не сработало. Однако это сработало бы, если бы что-нибудь было в отличном состоянии, кроме сущностей. Я опубликовал решение как комментарий к аналогичному вопросу для случаев, когда вы хотите, чтобы классы @Entity, написанные на Groovy, подбирались генератором querydsl здесь - person Kostas Filios; 22.12.2014

Чтобы использовать генератор метамодели 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.

person jverhoelen    schedule 20.04.2016
comment
Не рекомендую добавлять сгенерированные модели в основные источники. Я бы предпочел добавить их в отдельный исходный каталог, например src / generated / java. Затем этот путь нужно добавить к основному набору источников java. Я не знаю смысла зависимости компиляции и аргументов compileJava, зачем вы их добавляете? - person Alex; 23.06.2017

Пример Querydsl Ant должен работать примерно так же, как если бы вы извлекали весь XML. В итоге получается что-то вроде этого:

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

src, cp и generated вы, вероятно, сможете извлечь из Gradle.

person ponzao    schedule 21.06.2011