Hibernate, Java 9 e SystemException

Ho cercato di eseguire l’applicazione Hibernate 5.2.11 nel progetto Java 9 / Spring Boot 1.5.x / Maven, ma non riesco a mancare alla class:

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.(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 

Qualcuno ha riscontrato questa eccezione e conosce una soluzione alternativa? Ho provato ad aggiungere --add-modules per javax.bind o java.se.ee ma non hanno aiutato.

L’errore sopra riportato viene mostrato in un test di integrazione mavan-failsafe (2.20.1) che avvia il contesto Spring con Hibernate. L’applicazione non ha alcun codice specifico Java 9.

Secondo la guida alla migrazione e i documenti java, dal momento che il modulo java.transaction che esporta il pacchetto javax.transaction è stato contrassegnato come @Deprecated .

Dovresti idealmente migrare il tuo codice per utilizzare javaee / javax.transaction . Attualmente, puoi farlo utilizzando il modulo automatico convertito dalla dipendenza:

  javax.transaction javax.transaction-api 1.2  

e aggiungendo al module-info.java quanto segue: –

 requires javax.transaction.api; 

Inoltre, mentre usi il maven-failsafe-plugin , assicurati di utilizzare la versione minima compatibile 2.20.1 o successiva come menzionato nel documento di avanzamento di Maven.

  org.apache.maven.plugins maven-failsafe-plugin 2.20.1  

@Deprecated (forRemoval = “dopo la conferma dell’OP”)

D’altra parte, una soluzione temporanea (dal momento che alla fine questi moduli verranno rimossi dal JDK) potrebbe essere quella di fare uso di: –

 --add-modules java.transaction 

Come menzionato nei commenti, dal momento che la dipendenza richiesta per javax.transaction-api è già disponibile sul classpath, non ti dovrebbe essere richiesto di aggiungere alcuna opzione del compilatore altrimenti avresti finito col sovrascrivere il pacchetto corrente con il modulo java.transaction javax.transaction pacchetto javax.transaction esportato che idealmente per il tuo caso d’uso non è SystemException .

Questo è quello che penso: --add-modules java.se.ee base a Modules Shared con Java EE Not Resolved by Default risolverà tutti i moduli Java EE, utilizzati per la risoluzione delle API interne . Pertanto, gli sviluppatori non hanno bisogno di aggiungere moduli specifici uno per uno. Dall’altra parte, JDK9 separa anche EE da SE. javax.transaction.SystemException non è più nella libreria JDK9, ma è nella libreria EE. Come in 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; } 

Ma per il modulo java.transaction ha solo: InvalidTransactionException, TransactionRequiredException, TransactionRolledbackException