Как сгенерировать метамодель JPA с помощью Gradle 5.x

В настоящее время я пытаюсь выполнить обновление с версии 4.8.1 до 5.1.1, но не могу создать метамодель гибернации для нашего кода.

Проблема в том, что Gradle 5 игнорирует процессор аннотаций, переданный с путем компиляции classpath, но все плагины, которые я обнаружил, используют это (т.е. "-proc:only").

Я попытался указать процессор аннотаций явно, как указано gradle ( https://docs.gradle.org/4.6/release-notes.html)annotationProcessor 'org.hibernate:hibernate-jpamodelgen'

Но это не помогает, и я все еще получаю следующую ошибку:

предупреждение: обработка аннотации без компиляции запрошена, но процессоры не найдены.

Может быть, плагины также должны быть обновлены, но, как я сказал, все плагины, которые я нашел, передают процессор аннотаций с classpath. В настоящее время мы используем это: https://github.com/Catalysts/cat-gradle-plugins/tree/master/cat-gradle-hibernate-plugin

3 ответа

Решение

Вы можете просто удалить плагин для модели JPA и просто использовать

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

Дополнительно я использую эти настройки, чтобы настроить, где должен жить сгенерированный код.

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

compileJava.options.compilerArgs += [
]

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

При работе с метамоделями в вашем проекте вы можете столкнуться с такими проблемами, какошибки в процессе сборки. В исходном принятом решении используется код, который сейчас устарел в новых версиях Gradle. Кроме того, он вводит новыйскомпилировать цель, что может вызвать дальнейшие осложнения в будущем.

Предлагаемое мной альтернативное решение направлено на решение этих проблем за счет использования обновленных функций Gradle и предотвращения потенциальных проблем.

Во-первых, нам нужно включить генератор моделей Hibernate JPA (файлартефакт) вконфигурация. Эта конфигурация предписывает компилятору Java использовать генератор моделей JPA Hibernate на этапе обработки аннотаций, генерируя классы метамодели JPA из ваших сущностей во время компиляции.

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

Не забудьте заменитьс желаемым номером версии.

Во-вторых, нам нужно настроить, где Gradle должен размещать сгенерированные исходные файлы, чтобы IDE и система сборки правильно распознавали и компилировали эти файлы. Следующая конфигурация Gradle достигает этого путем адаптацииопция для каждого набора источников, позволяющая хранить сгенерированные источники согласованным и удобным для организации способом:

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

Используя, мы гарантируем, что эта конфигурация будет применена ко всем исходным наборам в проекте. Для каждого исходного набора (например,,), сгенерированные исходные файлы будут организованы в специальные папки с соблюдением иерархии проекта.

Таким образом, это альтернативное решение позволяет избежать устаревшего кода и сводит к минимуму потенциальные проблемы за счет использования новых функций Gradle. Добавление этой конфигурации позволит правильно распознавать, компилировать и использовать в проекте созданные классы метамодели JPA без каких-либо проблем.

Использование 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).

Другие вопросы по тегам