有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate 5与JDK 9的问题

我有一个Hibernate5项目,它完美地构建并运行在Java8上。我试着在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。东南方。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) 个答案

  1. # 1 楼答案

    JavaSE定义了JTA的一小部分。它不包括javax。交易SystemException,因为该异常在JTA的JavaEE版本中,而不是JavaSE子集中

    当您使用 add-modules java.se.ee运行时,它会导致解析JavaSE和JavaEE之间共享的模块,这包括Java。事务模块。在javax中加载类型的任何尝试。事务包将从java加载。事务模块,但由于该模块只有一小部分JTA,因此javax。交易找不到SystemException

    如果您从命令行中删除 add-modules java.se.ee,那么您将发现javax。交易可以加载SystemException,因为它位于类路径上。因此,如果您只需要JAXB(module java.xml.bind),那么将该模块指定为 add-modules,而不是“java.se.ee”聚合器,该聚合器将导致解析与JavaEE共享的所有模块

  2. # 2 楼答案

    虽然这个问题似乎很老,但还没有答案,而且自从JDK的GA发布完成后。根据migration guide和java文档,因为导出包javax.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;
    

    编辑:感谢to @ImpulseTheFox验证上述jar版本1.3的自动模块名称是否需要:-

    requires java.transaction;