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
类)位于类路径中
有没有关于如何解决这个问题的建议
# 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 楼答案
虽然这个问题似乎很老,但还没有答案,而且自从JDK的GA发布完成后。根据migration guide和java文档,因为导出包} 被标记为
javax.transaction
的模块^{@Deprecated
理想情况下,您应该将代码迁移为使用javaee/javax.transaction。目前,您可以使用从依赖项转换而来的自动模块执行此操作:
并在
module-info.java
中添加以下内容:编辑:感谢to @ImpulseTheFox验证上述jar版本1.3的自动模块名称是否需要:-