Gradle дважды генерирует метаданные Querydsl через разные процессоры аннотаций.

У меня есть скрипт сборки Gradle. Я хочу, чтобы этот скрипт генерировал метаданные QueryDSL. Эти метаданные должны создаваться в папке build/generated-sources/metamodel.

Проблема, с которой я сталкиваюсь в данный момент, заключается в том, что метамодель генерируется не один раз, а дважды. Наряду с желаемой целью он также создается в «по умолчанию» buld/classes/..., что приводит к ошибке «дубликата класса».

sourceSets {
    generated.java.srcDirs=['build/generated-sources/metamodel']
    main {
        java { srcDir 'src/main/java' }
    }
    test {
        java { srcDir 'src/main/test' }
    }
}

configurations { querydslapt }

dependencies {
    compile 'org.hibernate:hibernate-entitymanager:5.2.3.Final',
            'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final-redhat-1',
            'com.querydsl:querydsl-jpa:4.1.3',
            // ... others, non-hibernate/querydsl ...
    querydslapt 'com.querydsl:querydsl-apt:4.1.3'
}

task generateSources(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.querydsl.apt.hibernate.HibernateAnnotationProcessor']
    destinationDir = sourceSets.generated.java.srcDirs.iterator().next()
}

compileJava {
    dependsOn generateSources
    source generateSources.destinationDir
}

Согласно трассировке gradle, проблема заключается в том, что в миксе есть два AnnotatioProcessors. Во-первых, HibernateAnnotationProcessor. Во-вторых, JPAAnnotationProcessor, в конечном итоге создающий дублирующийся класс. И я не могу понять почему, скрипт сборки выглядит нормально. Я знаю, что это могут быть догадки, но я благодарен за любые предложения. На всякий случай я даже почистил свой gradle-cache. Это может быть даже не проблема, связанная с чистым скриптом сборки, но поведение сохраняется, даже если я запускаю скрипт через консоль.

Суть, в основном именно то, что мне "должно" понадобиться

(старее) Сообщение об этой проблеме


person Nikolas    schedule 09.01.2017    source источник


Ответы (1)


Решение этого потока у меня работает, идея состоит в том, чтобы подключить процессор аннотаций к javac, HibernateAnnotationProcessor можно объявить через compilerArgs, примерно так :

dependencies {
    compile 'org.hibernate:hibernate-entitymanager:5.2.3.Final',
            'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final-redhat-1',          
            'com.querydsl:querydsl-jpa:4.1.4',
            'com.querydsl:querydsl-apt:4.1.4',
            // other
}

ext {
    generatedSourcesDir = file("build/generated-sources/metamodel")
}

sourceSets {
    main {
        java {
            srcDir 'src/main/java'
            srcDir generatedSourcesDir
        }
    }
    test {
        java { srcDir 'src/main/test' }
    }
}

compileJava {
    doFirst {
        generatedSourcesDir.mkdirs()
    }
    options.compilerArgs += ['-s', generatedSourcesDir,
                             '-processor', 'com.querydsl.apt.hibernate.HibernateAnnotationProcessor']
}

Но мне все еще интересно, почему первый подход не работает (запускает два процессора аннотаций), поэтому любая идея по-прежнему высоко ценится.

person Nikolas    schedule 10.01.2017