Hibernate, Java 9 e SystemException




spring maven (2)

Questo è quello che penso: --add-modules java.se.ee secondo Moduli condivisi con Java EE non risolto di default risolverà tutti i moduli Java EE, usati per risolvere le API interne . Pertanto, gli sviluppatori non devono aggiungere uno specifico modulo uno per uno. Dall'altro lato, JDK9 sta anche separando 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

Ho provato a eseguire l'applicazione Hibernate 5.2.11 nel progetto Java 9 / Spring Boot 1.5.x / Maven ma non riesco a mancare la classe:

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

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 mi hanno aiutato.

L'errore sopra riportato mostra un test di integrazione mavan-fail-safe (2.20.1) che avvia il contesto Spring con Hibernate. L'applicazione non ha alcun codice specifico per 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 .

Idealmente dovresti migrare il tuo codice per usare invece javaee/javax.transaction . Attualmente, puoi farlo utilizzando il modulo automatico convertito dalla dipendenza:

<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>javax.transaction-api</artifactId>
    <version>1.2</version>
</dependency>

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

requires javax.transaction.api;

Inoltre, durante l'utilizzo del maven-failsafe-plugin 2.20.1 - 2.20.1 , assicurati di utilizzare la versione minima compatibile 2.20.1 o successiva, come indicato nel documento di avanzamento di Maven.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.20.1</version>
</plugin>

@Deprecated (forRemoval = "dopo la conferma dell'OP")

D'altra parte, una soluzione temporanea (poiché alla fine questi moduli verranno rimossi dal JDK) potrebbe essere quella di utilizzare: -

--add-modules java.transaction

Come menzionato nei commenti, poiché la dipendenza richiesta per javax.transaction-api è già disponibile sul classpath, non dovresti essere obbligato ad aggiungere alcuna opzione del compilatore altrimenti java.transaction per sovrascrivere il pacchetto corrente con il modulo java.transaction pacchetto javax.transaction esportato che idealmente per il tuo caso d'uso non è costituito da SystemException .





java-9