2017-10-01 2 views
5

Ich habe versucht, Hibernate 5.2.11 Anwendung in Java 9/Frühjahr Boot-1.5.x/Maven Projekt laufen, aber ich fehlende Klasse bin Fehler:Hibernate, Java 9 und Systemexception

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 

Hat Jeder ist auf diese Ausnahme gestoßen und kennt einen Workaround? Ich habe versucht, --add-modules für javax.bind oder java.se.ee hinzuzufügen, aber sie haben nicht geholfen.

Der obige Fehler wird in einem mavan-failsafe (2.20.1) Integrationstest angezeigt, der den Spring-Kontext mit Hibernate startet. Die Anwendung hat keinen Java 9-spezifischen Code.

+1

verwendet I Failsafe-2.20.1 –

+3

Ich weiß nichts über das Failsafe-Plugin, aber es gab vor kurzem eine Änderung am todsicheren Plugin, wo es geändert wurde, um '--add-modules java.se.ee' zu ​​verwenden, genau das Falsche, wenn man versucht, ein Standardmodul mit der Java EE-Version der Komponente. Es gibt ein Problem, das dies für das todsichere Plugin verfolgt (https://issues.apache.org/jira/browse/SUREFIRE-1424). –

+0

@AlanBateman Danke, komischerweise scheitert es mit javax.xml.bind im Falle von 2.20 (und 2.19.1) obwohl ich '--add-modules java.xml.bind' hinzugefügt habe –

Antwort

2

Nach der migration guide und der Java-Dokumentation, da das Modul java.transaction, die das Paket exportiert javax.transaction als @Deprecated markiert wurde.

Sie sollten idealerweise Ihren Code für die Verwendung von javaee/javax.transaction migrieren. Derzeit können Sie tun so automatische Modul aus der Abhängigkeit umgewandelt werden:

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

und zur Ergänzung der module-info.java die folgenden: -

requires javax.transaction.api; 

Zusätzlich, während die maven-failsafe-plugin verwenden, stellen Sie sicher, Sie verwenden die mindestens kompatible Version 2.20.1 oder höher, wie in der progress document of Maven.

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

@deprecated (forRemoval = "nach OP Bestätigung")

Auf der anderen Seite, ein temporary workaround (da schließlich werden diese Module aus dem JDK entfernt werden) könnte Gebrauch machen : -

--add-modules java.transaction 

Wie in den Kommentaren erwähnt, da auf dem classpath die erforderliche Abhängigkeit für javax.transaction-api bereits verfügbar ist, sollten Sie nicht erforderlich jede Compiler-Option hinzufügen oder sonst würden Sie am Ende das aktuelle Paket mit dem java.transaction Modul exportierten javax.transaction Paket überschreiben, das ideal für Ihren Anwendungsfall nicht aus besteht. Diese

+0

Ich bekomme den gleichen Fehler mit dieser Abhängigkeit (und leeren '--add-modules') –

+0

Ich füge kein Modul, ich nur, um Anwendung, die auf Java 8 läuft, auf Java 9 zu laufen. –

+1

@ KrzysztofKrasoń Es ist nicht Ihr spezifischer Code, sondern Java 9, der das Feature als veraltet markiert. – nullpointer

0

ist, was ich denke: --add-modules java.se.ee nach Modules Shared with Java EE Not Resolved by Defaultalle Java EE Module lösen wird, verwendet für die Lösung internen APIs. Daher müssen Entwickler kein bestimmtes Modul einzeln hinzufügen. Auf der anderen Seite trennt JDK9 auch EE von SE. javax.transaction.SystemException ist nicht mehr in JDK9-Bibliothek, aber es ist in EE-Bibliothek. Wie in java.se.ee Modul-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; 

} 

Aber für Modul java.transaction es nur hat: InvalidTransactionException, TransactionRequiredException, TransactionRolledbackException