我一直在尝试在Java 9 / Spring Boot 1.5.x / Maven项目中运行Hibernate 5.2.11应用程序,但是我在缺少类时失败了:
Caused by: java.lang.NoClassDefFoundError: javax/transaction/SystemException
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
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)
at org.jboss.logging.Logger.getMessageLogger(Logger.java:2516)
at org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:28)
at org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:24)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.factorybean.createNativeEntityManagerFactory(LocalContainerEntityManagerfactorybean.java:353)
at org.springframework.orm.jpa.AbstractEntityManagerfactorybean.buildNativeEntityManagerFactory(AbstractEntityManagerfactorybean.java:370)
at org.springframework.orm.jpa.AbstractEntityManagerfactorybean.afterPropertiesSet(AbstractEntityManagerfactorybean.java:359)
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.invokeInitMethods(AbstractAutowireCapablebeanfactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.initializeBean(AbstractAutowireCapablebeanfactory.java:1624)
... 33 more
有没有人遇到过此异常并知道解决方法?我尝试为javax.bind或java.se.ee添加–add-modules,但它们没有帮助.
上面的错误显示在mavan-failsafe(2.20.1)集成测试中,它使用Hibernate启动Spring上下文.
应用程序没有任何Java 9特定代码.
最佳答案
根据migration guide和java文档,由于导出包javax.transaction的模块
原文链接:/spring/432454.htmljava.transaction
已被标记为@Deprecated.
理想情况下,您应该将代码迁移到使用javaee/javax.transaction.目前,您可以使用从依赖项转换的自动模块来执行此操作:
并添加到module-info.java以下内容: –
requires javax.transaction.api;
此外,在使用maven-failsafe-plugin时,请确保使用progress document of Maven.中提到的最低兼容版本2.20.1或更高版本
@Deprecated(在OP确认后forRemoval =“)
另一方面,temporary workaround(因为最终将从JDK中删除这些模块)可以使用: –
--add-modules java.transaction
正如评论中所提到的,由于javax.transaction-api所需的依赖关系已经在类路径中可用,因此不应该要求添加任何编译器选项,否则最终会使用java.transaction模块覆盖当前包.导出javax.transaction包,理想情况下,您的用例不包含SystemException.