Gradle 5 QueryDsl 生成重复项类
Gradle 5 QueryDsl Generating Duplicate Classes
我正在使用 queryDsl 生成带有 Gradle 的 Q classes。它曾经在 Gradle 3.5 上运行良好,但在升级到 Gradle 5.5.1 时,它失败并出现重复的 class 错误。
我的 generateQueryDsl 任务在 'gensrc/' 下生成 classes 时工作正常,但在 compileJava 上,classes 在 'build/generated/' 下再次生成,最终给出重复的 class错误。
dependencies {
api("org.springframework.boot:spring-boot-starter-data-jpa") {
exclude group: "org.hibernate", module: "hibernate-entitymanager"
exclude group: "org.hibernate", module: "hibernate-core"
exclude group: "org.apache.tomcat", module: "tomcat-jdbc"
}
api("com.zaxxer:HikariCP:${hikaricpVersion}")
api("com.h2database:h2:1.4.193")
api("mysql:mysql-connector-java")
api("com.microsoft.sqlserver:sqljdbc42:6.0.8112")
api("org.springframework.data:spring-data-jpa")
api("org.springframework:spring-jdbc")
api("org.springframework:spring-orm")
api("org.eclipse.persistence:javax.persistence:${eclipseLinkPersistenceVersion}")
api("org.eclipse.persistence:eclipselink:${eclipseLinkVersion}")
api("org.eclipse.persistence:org.eclipse.persistence.jpa:${eclipseLinkVersion}")
api("com.mysema.querydsl:querydsl-sql:${queryDslVersion}")
api("com.mysema.querydsl:querydsl-jpa:${queryDslVersion}")
api("com.mysema.querydsl:querydsl-apt:${queryDslVersion}")
annotationProcessor('com.mysema.querydsl:querydsl-apt:3.7.4:jpa')
annotationProcessor("org.springframework.boot:spring-boot-starter-data-jpa")
}
task generateQueryDSL(type: JavaCompile, group: 'build) {
source = sourceSets.main.java
classpath = configurations.compileClasspath
options.annotationProcessorPath = configurations.annotationProcessor
destinationDir = file('gensrc/main/java')
}
compileJava {
dependsOn generateQueryDSL
}
error: duplicate class: com.persistence.domain.model.QOrganizationBasedModel
and likewise for all generated classes
当你使用annotationProcessor
配置时,默认compileJava
任务将处理器添加到编译器,它会在build/generated/sources/annotationProcessor/java/main
中生成类。
在您的情况下,您还声明了一个额外的 JavaCompile
任务,您为其提供了相同的 annotationProcessor 配置,然后它将再次生成相同的 类。
为了解决这个问题,我将完全删除 generateQueryDSL
任务,因为 compileJava
很可能已经完成了您需要的一切。如果您喜欢将生成的源放在不同的文件夹中,您可以通过 CompileOptions 来实现,但我建议在大多数情况下将它们放在 build 文件夹下。
我正在使用 queryDsl 生成带有 Gradle 的 Q classes。它曾经在 Gradle 3.5 上运行良好,但在升级到 Gradle 5.5.1 时,它失败并出现重复的 class 错误。
我的 generateQueryDsl 任务在 'gensrc/' 下生成 classes 时工作正常,但在 compileJava 上,classes 在 'build/generated/' 下再次生成,最终给出重复的 class错误。
dependencies {
api("org.springframework.boot:spring-boot-starter-data-jpa") {
exclude group: "org.hibernate", module: "hibernate-entitymanager"
exclude group: "org.hibernate", module: "hibernate-core"
exclude group: "org.apache.tomcat", module: "tomcat-jdbc"
}
api("com.zaxxer:HikariCP:${hikaricpVersion}")
api("com.h2database:h2:1.4.193")
api("mysql:mysql-connector-java")
api("com.microsoft.sqlserver:sqljdbc42:6.0.8112")
api("org.springframework.data:spring-data-jpa")
api("org.springframework:spring-jdbc")
api("org.springframework:spring-orm")
api("org.eclipse.persistence:javax.persistence:${eclipseLinkPersistenceVersion}")
api("org.eclipse.persistence:eclipselink:${eclipseLinkVersion}")
api("org.eclipse.persistence:org.eclipse.persistence.jpa:${eclipseLinkVersion}")
api("com.mysema.querydsl:querydsl-sql:${queryDslVersion}")
api("com.mysema.querydsl:querydsl-jpa:${queryDslVersion}")
api("com.mysema.querydsl:querydsl-apt:${queryDslVersion}")
annotationProcessor('com.mysema.querydsl:querydsl-apt:3.7.4:jpa')
annotationProcessor("org.springframework.boot:spring-boot-starter-data-jpa")
}
task generateQueryDSL(type: JavaCompile, group: 'build) {
source = sourceSets.main.java
classpath = configurations.compileClasspath
options.annotationProcessorPath = configurations.annotationProcessor
destinationDir = file('gensrc/main/java')
}
compileJava {
dependsOn generateQueryDSL
}
error: duplicate class: com.persistence.domain.model.QOrganizationBasedModel
and likewise for all generated classes
当你使用annotationProcessor
配置时,默认compileJava
任务将处理器添加到编译器,它会在build/generated/sources/annotationProcessor/java/main
中生成类。
在您的情况下,您还声明了一个额外的 JavaCompile
任务,您为其提供了相同的 annotationProcessor 配置,然后它将再次生成相同的 类。
为了解决这个问题,我将完全删除 generateQueryDSL
任务,因为 compileJava
很可能已经完成了您需要的一切。如果您喜欢将生成的源放在不同的文件夹中,您可以通过 CompileOptions 来实现,但我建议在大多数情况下将它们放在 build 文件夹下。