JDK 9的Hibernate 5问题

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

  org.apache.maven.plugins maven-surefire-plugin 2.20  --add-modules java.xml.bind   

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

 --add-modules java.se.ee 

我有一个例外:

 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类)在运行测试时位于类路径中。

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

虽然这个问题看起来很旧,但尚未得到答复,因为JDK的GA版本已经完成。 根据迁移指南和java文档,由于导出包javax.transaction的模块java.transaction已被标记为@Deprecated

理想情况下,您应该将代码迁移到使用javaee / javax.transaction 。 目前,您可以使用从依赖项转换的自动模块来执行此操作:

  javax.transaction javax.transaction-api 1.2  

并添加到module-info.java以下内容: –

 requires javax.transaction.api; 

编辑 :感谢@ImpulseTheFoxvalidation上述jar版本1.3的自动模块名称是否需要: –

 requires java.transaction; 

Java SE定义了一小部分JTA。 它不包括javax.transaction.SystemException,因为该exception位于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删除--add-modules java.se.ee ,那么您将发现可以加载javax.transaction.SystemException,因为它位于类路径上。 因此,如果您只需要JAXB(模块java.xml.bind),那么将该模块指定为--add-modules ,而不是将导致与Java EE共享的所有模块的“java.se.ee”聚合器。