我有一个完全构建并运行在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
类)在测试运行时位于类路径中。
有关如何解决此问题的任何建议吗?
答案 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;