java - Hibernate、Java 9 和 SystemException

标签 java spring hibernate maven java-9

我一直在尝试在 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/

相关文章:

java - Resources.openRawResource() 问题 Android

java - 这可以只用递归来完成吗?

java - 如何将 "find or create"方法提取到抽象类? ( Spring 数据 Jpa)

java - IntelliJ : Cannot resolve symbol 'springframework'

spring - ApplicationEventPublisher 没有被 Autowiring 到组件中

java - 无法保留具有共享 ID 的实体

java - ffmpeg 在 java 退出之前不会启动

java - org.apache.jasper.JasperException : The function test must be used with a prefix when a default namespace is not specified

java - 如何使用我的子模块中的 application.yml 文件?

java - JPA 存储库 '[X]' 操作上的 key '[Y]' 重复条目 'save'。保存的实体已定义其键