У меня возникли проблемы при попытке запустить Hibernate в проекте, в котором есть модули. Я пытаюсь модернизировать старый инструмент, использующий старую версию Hibernate, с помощью JPA на основе Javax, и пытаюсь перенести его на более новую версию и сделать его основанным на Джакарте.
Длинный Короче говоря, происходит сбой с ExceptionInInitializerError при попытке создать экземпляр класса HibernatePersistenceProvider из-за какой-то проблемы с модулем при обработке журнала JBoss. Инструмент использует HibernatePersistenceProvider для вызова метода createContainerEntityManagerFactory.
Чтобы изолировать проблему, я создал MCVE.
MCVE
Я использую Gradle 8.10.2 и Java 23. Все остальные версии пакета находятся в файле gradle.build.
Это файл build.gradle:
Код: Выделить всё
plugins {
id("java-library")
id("project-report")
}
description = "MCVE for a problem in Hibernate"
group = "com.example"
version = "1.0"
def artifactName = "com.example"
def moduleName = "com.example"
def versionApiguardian = "1.1.2"
def versionHibernate = "7.0.0.Beta1"
def versionJakartaAnno = "3.0.0"
def versionJakartaCdi = "4.1.0"
def versionJakartaEl = "6.0.1"
def versionJakartaInj = "2.0.1"
def versionJakartaInt = "2.2.0"
def versionJakartaJpa = "3.2.0"
def versionJakartaJta = "2.0.1"
def versionJBossLog = "3.6.1.Final"
def versionJunit = "5.11.2"
def versionJunitPlatf = "1.11.2"
dependencies {
// Jakarta, JPA and friends.
testImplementation(group: "jakarta.annotation" , name: "jakarta.annotation-api" , version: versionJakartaAnno)
testImplementation(group: "jakarta.enterprise" , name: "jakarta.enterprise.cdi-api" , version: versionJakartaCdi )
testImplementation(group: "jakarta.enterprise" , name: "jakarta.enterprise.lang-model", version: versionJakartaCdi )
testImplementation(group: "jakarta.persistence", name: "jakarta.persistence-api" , version: versionJakartaJpa )
testImplementation(group: "jakarta.transaction", name: "jakarta.transaction-api" , version: versionJakartaJta )
testImplementation(group: "jakarta.inject" , name: "jakarta.inject-api" , version: versionJakartaInj )
testImplementation(group: "jakarta.interceptor", name: "jakarta.interceptor-api" , version: versionJakartaInt )
testImplementation(group: "jakarta.el" , name: "jakarta.el-api" , version: versionJakartaEl )
// JUnit.
testImplementation(group: "org.junit.platform", name: "junit-platform-launcher", version: versionJunitPlatf )
testImplementation(group: "org.junit.jupiter" , name: "junit-jupiter-api" , version: versionJunit )
testImplementation(group: "org.junit.jupiter" , name: "junit-jupiter-params" , version: versionJunit )
testImplementation(group: "org.junit.jupiter" , name: "junit-jupiter-engine" , version: versionJunit )
testImplementation(group: "org.apiguardian" , name: "apiguardian-api" , version: versionApiguardian)
// Hibernate.
testImplementation(group: "org.hibernate.orm", name: "hibernate-core", version: versionHibernate)
// JBoss Logging.
testImplementation(group: "org.jboss.logging", name: "jboss-logging", version: versionJBossLog)
}
repositories {
mavenLocal()
mavenCentral()
gradlePluginPortal()
}
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
options.debug = true
options.fork = true
options.compilerArgs testIt() FAILED
java.lang.ExceptionInInitializerError
at com.example/com.example.SomeTest.testIt(SomeTest.java:9)
Caused by:
java.lang.IllegalArgumentException: This library does not have private access to interface org.hibernate.internal.EntityManagerMessageLogger
at org.jboss.logging@3.6.1.Final/org.jboss.logging.Logger.getMessageLogger(Logger.java:2572)
at org.jboss.logging@3.6.1.Final/org.jboss.logging.Logger.getMessageLogger(Logger.java:2552)
at org.hibernate.orm.core@7.0.0.Beta1/org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:28)
at org.hibernate.orm.core@7.0.0.Beta1/org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:24)
at org.hibernate.orm.core@7.0.0.Beta1/org.hibernate.jpa.HibernatePersistenceProvider.(HibernatePersistenceProvider.java:42)
... 1 more
1 test completed, 1 failed
Код: Выделить всё
SomeTest > testIt() FAILED
java.lang.IllegalAccessError: superclass access check failed: class org.jboss.logging.JBossLogRecord (in module org.jboss.logging) cannot access class java.util.logging.LogRecord (in module java.logging) because module org.jboss.logging does not read module java.logging
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1026)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1103)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:182)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:741)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:665)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:528)
at org.jboss.logging@3.5.0.Final/org.jboss.logging.JDKLoggerProvider.getLogger(JDKLoggerProvider.java:29)
at org.jboss.logging@3.5.0.Final/org.jboss.logging.LoggerProviders.logProvider(LoggerProviders.java:150)
at org.jboss.logging@3.5.0.Final/org.jboss.logging.LoggerProviders.tryJDK(LoggerProviders.java:106)
at org.jboss.logging@3.5.0.Final/org.jboss.logging.LoggerProviders.findProvider(LoggerProviders.java:101)
at org.jboss.logging@3.5.0.Final/org.jboss.logging.LoggerProviders.find(LoggerProviders.java:32)
at org.jboss.logging@3.5.0.Final/org.jboss.logging.LoggerProviders.(LoggerProviders.java:29)
at org.jboss.logging@3.5.0.Final/org.jboss.logging.Logger.getLogger(Logger.java:2465)
at org.jboss.logging@3.5.0.Final/org.jboss.logging.Logger.doGetMessageLogger(Logger.java:2573)
at org.jboss.logging@3.5.0.Final/org.jboss.logging.Logger.getMessageLogger(Logger.java:2530)
at org.jboss.logging@3.5.0.Final/org.jboss.logging.Logger.getMessageLogger(Logger.java:2516)
at org.hibernate.orm.core@7.0.0.Beta1/org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:28)
at org.hibernate.orm.core@7.0.0.Beta1/org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:24)
at org.hibernate.orm.core@7.0.0.Beta1/org.hibernate.jpa.HibernatePersistenceProvider.(HibernatePersistenceProvider.java:42)
at com.example/com.example.SomeTest.testIt(SomeTest.java:9)
1 test completed, 1 failed
В качестве доказательства концепции, если я пожертвую модульностью, удалю файл Module-info.java и закомментирую блок doFirst в файле gradle.build, он работает!
Однако я не могу пожертвовать модульностью в своей среде.Мои вопросы
- Может быть, мне стоит добавить что-нибудь в файл Module-info.java?
- Или, может быть, мне следует изменить версию какого-то пакета?
- Или, возможно, добавить некоторые параметры командной строки --add-opens где-нибудь в gradle.build?
- Или мне следует избегать прямого создания экземпляра HibernatePersistenceProvider, и то, что это сработало, было не более чем случайностью?
- Это ошибка в Hibernate 7.0.0 Beta 1?
[*]Что я делаю не так?
[*]Как это исправить?
[*]Есть идеи?
< /ul>
Я пробовал много способов решить эту проблему, но, кроме простого выбрасывания модульности, пока ничего не помогло.
Подробнее здесь: https://stackoverflow.com/questions/791 ... nvironment