2017-06-06 54 views
3

我有一個Hibernate 5項目,可以在Java 8上完美地構建和運行。我試圖在JDK 9 ea build 171上測試它。 由於它是一個龐大的項目並且有其他依賴關係,我必須添加java.xml.bind模塊到JVM配置測試:JDK 9發生Hibernate 5問題

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

有,我可以解決,但如果使用的凝集模塊java.se.ee(推薦)其他事項:

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

我得到了一個例外:

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) 

我甚至不明白爲什麼會發生這種情況,因爲JTA庫(SystemException類)在運行測試時位於類路徑中。

有關如何解決此問題的任何建議?

+0

JDK 9尚不穩定,並建立它是不保證。事實上,他們在JDK 9下自動構建並禁用了它,因爲API尚未準備好,它只是在郵件中發送垃圾郵件。 – coladict

回答

2

Java SE定義了JTA的一個小子集。它不包含javax.transaction.SystemException,因爲該異常位於Java EE版本的JTA中,而不是Java SE子集中。

當您使用--add-modules java.se.ee運行時,它會導致解決Java SE和Java EE之間共享的模塊,這包括java.transaction模塊。任何在javax.transaction包中加載類型的嘗試都將從java.transaction模塊加載,但由於此模塊只包含JTA的一小部分,因此將不會找到javax.transaction.SystemException。

如果您從命令行中刪除--add-modules java.se.ee,則會發現javax.transaction.SystemException可以加載,因爲它位於類路徑中。因此,如果您只需要JAXB(模塊java.xml.bind),那麼將該模塊指定爲--add-modules,而不是用於解決與Java EE共享的所有模塊的「java.se.ee」聚合器。

2

雖然這個問題似乎過時了,但尚未得到答覆,並且自JDK的GA發佈版已完成。根據migration guide和java文檔,因爲導出包javax.transaction的模塊java.transaction已被標記爲@Deprecated

您應該理想地將您的代碼遷移到使用javaee/javax.transaction代替。目前,你可以這樣做使用從依賴轉變自動模塊

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

,並增加了module-info.java如下: -

requires javax.transaction.api;