JDK 9的Hibernate 5问题

时间:2017-06-06 09:08:28

标签: 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>

还有其他问题我可以解决,但如果使用聚合模块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类)在测试运行时位于类路径中。

有关如何解决此问题的任何建议吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

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

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

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

requires javax.transaction.api;

编辑 :感谢javaee/javax.transaction验证上述jar版本1.3的自动模块名称是否需要: -

requires java.transaction;