如何使用Gradle 5.x生成JPA元模型

t0ybt7op  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(182)

我目前正在尝试从Gradle 4.8.1升级到5.1.1,但无法为我们的代码生成Hibernate元模型。
问题是Gradle 5忽略了通过编译类路径传递的注解处理器,但我发现的所有插件都在使用这个(即"-proc:only")。
我尝试按照gradle(https://docs.gradle.org/4.6/release-notes.html#convenient-declaration-of-annotation-processor-dependencies)所指出的那样显式地指定注解处理器annotationProcessor 'org.hibernate:hibernate-jpamodelgen'
但这并没有帮助,我仍然得到以下错误:
警告:未请求编译的注解处理,但未找到处理器。
也许插件也需要更新,但正如我所说,我发现的所有插件都通过注解处理器的类路径。我们目前正在使用这个:https://github.com/Catalysts/cat-gradle-plugins/tree/master/cat-gradle-hibernate-plugin

bz4sfanl

bz4sfanl1#

你可以删除jpa modelgen的插件,然后使用

annotationProcessor('org.hibernate:hibernate-jpamodelgen:<version>')

另外,我使用这些设置来配置生成的代码应该驻留在哪里。

tasks.withType(JavaCompile) {
  options.annotationProcessorGeneratedSourcesDirectory = file("src/generated/java")
}

sourceSets {
    generated {
        java {
            srcDirs = ['src/generated/java']
        }
    }
}
js5cn81o

js5cn81o2#

在项目中使用元模型时,您可能会在构建过程中遇到诸如error: package jakarta.persistence.metamodel does not exist错误之类的问题。提供的最初接受的解决方案使用的代码现在在Gradle的新版本中被弃用。此外,它引入了一个新的generated编译目标,这可能会导致进一步的复杂性。
我提出的替代解决方案旨在通过利用更新的Gradle特性和避免潜在问题来解决这些问题。
首先,我们需要在annotationProcessor配置中包含Hibernate JPA Model Generator(org.hibernate:hibernate-jpamodelgen工件)。此配置指示Java编译器在注解处理阶段使用Hibernate JPA模型生成器,在编译时从实体生成JPA元模型类。

dependencies {
  annotationProcessor('org.hibernate.orm:hibernate-jpamodelgen:<version>')
}

请记住将<version>替换为所需的版本号。
第二,我们需要配置Gradle应该放置生成的源文件的位置,确保IDE和构建系统正确识别和编译这些文件。以下Gradle配置通过为每个源集调整annotationProcessorGeneratedSourcesDirectory选项,以一致且组织友好的方式存储生成的源来实现:

sourceSets.configureEach { sourceSet ->
  tasks.named(sourceSet.compileJavaTaskName).configure {
    options.annotationProcessorGeneratedSourcesDirectory = file("$buildDir/generated/sources/annotationProcessor/java/$sourceSet.name")
  }
}

通过使用configureEach,我们可以确保将此配置应用于项目中的所有源代码集。对于每个源集(例如maintest),生成的源文件将按照项目层次结构组织到专用文件夹中。
总之,这个替代解决方案避免了不推荐的代码,并通过使用更新的Gradle特性最小化潜在问题。添加此配置将使生成的JPA元模型类能够被正确识别、编译并在项目中使用,而不会出现任何问题。

相关问题