Hibernate,Java 9和SystemException

Krz*_*soń 6 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
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过此异常并知道解决方法?我尝试添加--add-modulesjavax.bind或java.se.ee,但他们没有帮助.

上面的错误显示在mavan-failsafe(2.20.1)集成测试中,它使用Hibernate启动Spring上下文.应用程序没有任何Java 9特定代码.

Nam*_*man 3

根据迁移指南和java文档,由于java.transaction导出包的模块javax.transaction已被标记为@Deprecated.

理想情况下,您应该将代码迁移为使用javaee/javax.transaction。目前,您可以使用从依赖项转换的自动模块来执行此操作:

<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>javax.transaction-api</artifactId>
    <version>1.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

并添加module-info.java以下内容:-

requires javax.transaction.api;
Run Code Online (Sandbox Code Playgroud)

另外,在使用时maven-failsafe-plugin,请确保您使用的是Maven 进度文档2.20.1中提到的最低兼容版本或更高版本。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.20.1</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)

@Deprecated(forRemoval="OP 确认后")

另一方面,临时解决方法(因为最终这些模块将从 JDK 中删除)可以使用:-

--add-modules java.transaction
Run Code Online (Sandbox Code Playgroud)

正如评论中提到的,由于所需的依赖项javax.transaction-api已经在类路径上可用,因此您不需要添加任何编译器选项,否则您最终会使用java.transaction模块的导出包覆盖当前javax.transaction包,这对于您的用例来说是理想的选择不包括SystemException.