2017-06-06 2 views
3

Ich habe ein Hibernate 5 Projekt, das perfekt auf Java 8 baut und läuft. Ich habe versucht, es auf JDK 9 ea Build 171 zu testen. Da es ein riesiges Projekt ist und andere Abhängigkeiten haben musste java.xml.bind Modul an die JVM-Konfiguration für Tests hinzufügen:Hibernate 5 Problem mit JDK 9

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.20</version> 
    <configuration> 
     <argLine>--add-modules java.xml.bind</argLine> 
    </configuration> 
</plugin> 

Es andere Fragen waren, die ich lösen konnte, aber wenn aggregierte Modul java.se.ee verwendet wird (wie empfohlen):

<argLine>--add-modules java.se.ee</argLine> 

ich habe ein Ausnahme:

java.lang.NoClassDefFoundError: javax/transaction/SystemException 
    at java.base/java.lang.Class.forName0(Native Method) 
    at java.base/java.lang.Class.forName(Class.java:374) 
    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) 

Ich konnte nicht einmal verstehen, warum es passiert ist, weil JTA-Bibliothek (mit Klasse) im Klassenpfad ist, wenn Tests ausgeführt wurden.

Irgendwelche Vorschläge, wie Sie das beheben können?

+0

JDK 9 ist noch nicht stabil, und baut dafür sind nicht garantiert. Tatsächlich hatten sie eine automatische Erstellung unter JDK 9 und deaktivierten sie, weil die API noch nicht fertig war und sie nur Fehler in den E-Mails spammte. – coladict

Antwort

2

Java SE definiert eine kleine Teilmenge von JTA. Sie enthält javax.transaction.SystemException nicht, da diese Ausnahme in der Java EE-Version von JTA und nicht in der Java SE-Teilmenge enthalten ist.

Wenn Sie mit --add-modules java.se.ee arbeiten, werden die Module zwischen Java SE und Java EE aufgelöst, einschließlich des Moduls java.transaction. Jeder Versuch, einen Typ im javax.transaction-Paket zu laden, wird vom java.transaction-Modul geladen, aber da dieses Modul nur eine kleine Teilmenge von JTA enthält, wird javax.transaction.SystemException nicht gefunden.

Wenn Sie --add-modules java.se.ee von Ihrer Befehlszeile löschen, werden Sie feststellen, dass javax.transaction.SystemException geladen werden kann, da es sich um den Klassenpfad handelt. Wenn Sie also nur JAXB (Modul java.xml.bind) benötigen, dann geben Sie dieses Modul an --add-modules an, nicht den Aggregator "java.se.ee", der alle mit Java EE gemeinsam genutzten Module auflösen wird.

2

Obwohl die Frage scheint alt, noch unbeantwortet und seit der GA-Release von JDK abgeschlossen ist. Nach der migration guide und der Java-Dokumentation, da das Modul java.transaction, die das Paket javax.transaction exportiert hat 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;