2017-06-06 27 views
3

我有一个Hibernate 5项目,可以在Java 8上完美地构建和运行。我试图在JDK 9 ea build 171上测试它。 由于它是一个庞大的项目并且有其他依赖关系,我必须添加java.xml.bind模块到JVM配置测试:JDK 9发生Hibernate 5问题

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

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

+0

JDK 9尚不稳定,并建立它是不保证。事实上,他们在JDK 9下自动构建并禁用了它,因为API尚未准备好,它只是在邮件中发送垃圾邮件。 – coladict

回答

2

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

2

虽然这个问题似乎过时了,但尚未得到答复,并且自JDK的GA发布版已完成。根据migration guide和java文档,因为导出包javax.transaction的模块java.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;