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

28
我目前正在尝试从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
3个回答

67

您可以只删除JPA modelgen插件并直接使用

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

此外,我使用这些设置来配置生成的代码所在的位置。

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


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

我在Stackoverflow上尝试了无数个答案,但没有一个适用于IntelliJ。这个终于奏效了! - Jonathan
1
@Tuom,它们没有任何作用,感谢您的注意,我已经删除了这行。 - M. Schett
3
生成的代码应该放在与原始实体类相同的包中,但是应该放在build文件夹下面。对吗? - Zon
我同意Zon的观点。将路径更改为“build/generated/java”会更加合理,而且它也可以与IntelliJ一起使用。“src/generated/java”会使生成的Java文件包含在源代码中。 - Danny Pang V
2
对于其他有困惑的人,请注意:annotationProcessor应该放在build.gradle文件的dependencies部分。 - Kevin
显示剩余3条评论

1
在项目中使用元模型时,您可能会遇到诸如“错误:包 jakarta.persistence.metamodel 不存在”之类的问题,在构建过程中出现错误。原始的解决方案已经过时,不适用于较新版本的Gradle。此外,它引入了一个新的“generated”编译目标,可能会在后续过程中引起更多的复杂性。
我提出的替代方案旨在通过利用更新的Gradle功能并避免潜在问题来解决这些问题。
首先,我们需要将Hibernate JPA模型生成器(即“org.hibernate:hibernate-jpamodelgen”工件)包含在“annotationProcessor”配置中。该配置指示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元模型类能够被正确识别、编译和在项目中使用,而不会出现任何问题。

太棒了!这节省了我几个小时的查找文档时间。 - tierriminator
太棒了!这节省了我几个小时的查找文档的时间。 - undefined

1
使用Gradle 8.3和IntelliJ IDEA 2023.1.2,在添加之后
dependencies {
    annotationProcessor("org.hibernate.orm:hibernate-jpamodelgen:6.3.1.Final")
}

在build.gradle.kts中运行`./gradlew compileJava`并刷新Idea项目后,Idea会自动识别生成的源代码(位于`build/generated/sources/annotationProcessor/java`目录下)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接