Hibernate, Java 9 y SystemException
spring maven (2)
De acuerdo con la
guía de migración
y los documentos de java, desde el módulo
java.transaction
que exporta el paquete
javax.transaction
se ha marcado como
@Deprecated
.
Lo ideal es migrar su código para usar javaee/javax.transaction lugar. Actualmente, puede hacerlo utilizando el módulo automático convertido desde la dependencia:
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<version>1.2</version>
</dependency>
y agregando al
module-info.java
lo siguiente: -
requires javax.transaction.api;
Además, mientras usa el complemento
maven-failsafe-plugin
asegúrese, asegúrese de estar utilizando la versión mínima compatible
2.20.1
o superior como se menciona en el
documento de progreso de Maven.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.20.1</version>
</plugin>
@Deprecated (forRemoval = "después de la confirmación de OP")
Por otro lado, una solución temporal (ya que eventualmente estos módulos se eliminarán del JDK) podría ser hacer uso de: -
--add-modules java.transaction
Como se menciona en los comentarios, dado que la dependencia requerida para
javax.transaction-api
ya está disponible en el classpath, no se le debe solicitar que agregue ninguna opción de compilador o terminaría anulando el paquete actual con el módulo
java.transaction
El paquete
javax.transaction
exportado que idealmente para su caso de uso no consiste en
SystemException
.
He estado tratando de ejecutar la aplicación Hibernate 5.2.11 en el proyecto Java 9 / Spring Boot 1.5.x / Maven pero estoy fallando en la clase faltante:
Caused by: java.lang.NoClassDefFoundError: javax/transaction/SystemException
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at org.jboss.logging.Logger$1.run(Logger.java:2554)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at org.jboss.logging.Logger.getMessageLogger(Logger.java:2529)
at org.jboss.logging.Logger.getMessageLogger(Logger.java:2516)
at org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:28)
at org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:24)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<clinit>(EntityManagerFactoryBuilderImpl.java:115)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:54)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
... 33 more
¿Alguien ha encontrado esta excepción y conoce una solución?
Intenté agregar
--add-modules
para javax.bind o java.se.ee pero no me ayudaron.
El error anterior se muestra en una prueba de integración mavan-failsafe (2.20.1) que inicia el contexto Spring con Hibernate. La aplicación no tiene ningún código específico de Java 9.
Esto es lo que pienso:
--add-modules java.se.ee
acuerdo con los
módulos compartidos con Java EE no resuelto por defecto
resolverá
todos los
módulos Java EE, utilizados para resolver
API internas
.
Por lo tanto, los desarrolladores no necesitan agregar un módulo específico uno por uno.
Por otro lado, JDK9 también está separando EE de SE.
javax.transaction.SystemException
ya no está en la biblioteca JDK9, pero está en la biblioteca EE.
Como en
java.se.ee
module-info:
@SuppressWarnings({"deprecation", "removal"})
@Deprecated(since="9", forRemoval=true)
module java.se.ee {
requires transitive java.se;
// Upgradeable modules for Java EE technologies
requires transitive java.activation;
requires transitive java.corba;
requires transitive java.transaction;
requires transitive java.xml.bind;
requires transitive java.xml.ws;
requires transitive java.xml.ws.annotation;
}
Pero para el módulo
java.transaction
solo tiene:
InvalidTransactionException, TransactionRequiredException, TransactionRolledbackException