JDK 9的Hibernate 5问题

Ser*_*gey 5 java hibernate java-9

我有一个完美构建并运行在Java 8上的Hibernate 5项目.我尝试在JDK 9 ea build 171上测试它.由于它是一个庞大的项目并且有其他依赖项,我不得不将java.xml.bind模块添加到JVM配置中进行测试:

<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>
Run Code Online (Sandbox Code Playgroud)

还有其他问题我可以解决,但如果使用聚合模块java.se.ee(如推荐):

<argLine>--add-modules java.se.ee</argLine>
Run Code Online (Sandbox Code Playgroud)

我有一个例外:

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)
Run Code Online (Sandbox Code Playgroud)

我甚至无法理解为什么会发生这种情况,因为JTA库(带有SystemException类)在测试运行时位于类路径中.

对于如何解决这个问题,有任何的建议吗?

Ala*_*man 4

Java SE 定义了 JTA 的一个小子集。它不包括 javax.transaction.SystemException,因为该异常位于 JTA 的 Java EE 版本中,而不是 Java SE 子集中。

当您运行--add-modules java.se.eethen 时,它会导致 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.se.ee”聚合器,这将导致与 Java EE 共享的所有模块得到解析。