我一直在尝试在 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.<clinit>(EntityManagerFactoryBuilderImpl.java:115)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:54)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.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
但它们没有帮助。
上述错误显示在使用 Hibernate 启动 Spring 上下文的 mavan-failsafe (2.20.1) 集成测试中。 应用程序没有任何 Java 9 特定代码。
最佳答案
根据migration guide和 java 文档,因为模块 java.transaction
导出包 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;
<小时/>
此外,在使用 maven-failsafe-plugin
时,请确保您使用的是 progress document of Maven. 中提到的最低兼容版本 2.20.1
或更高版本。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<小时/>
@Deprecated(forRemoval="OP 确认后")
另一方面,temporary workaround (因为最终这些模块将从 JDK 中删除)可以利用:-
--add-modules java.transaction
正如评论中提到的,由于 javax.transaction-api
所需的依赖项已在类路径上可用,因此您不需要添加任何编译器选项,否则您最终会使用 java.transaction
模块导出的 javax.transaction
包覆盖当前包,理想情况下,您的用例不包含 SystemException
。
关于java - Hibernate、Java 9 和 SystemException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46575865/