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”聚合器。