Hibernate,Java 9和SystemException

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

有没有人遇到此exception并知道解决方法? 我尝试为javax.bind或java.se.ee添加--add-modules ,但是他们没有帮助。

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

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

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

  javax.transaction javax.transaction-api 1.2  

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

 requires javax.transaction.api; 

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

  org.apache.maven.plugins maven-failsafe-plugin 2.20.1  

@Deprecated(在OP确认后forRemoval =“)

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

 --add-modules java.transaction 

正如评论中所提到的,由于javax.transaction-api的必需依赖项已经在类路径中可用,因此不应该要求添加任何编译器选项,否则最终会使用java.transaction模块覆盖当前包。导出javax.transaction包,理想情况下,您的用例不包含SystemException

这就是我的想法: --add-modules java.se.ee根据与Java EE共享 --add-modules java.se.ee将解析用于解析内部API的 所有 Java EE模块。 因此,开发人员不需要逐个添加特定模块。 另一方面,JDK9也将EE与SE分开。 javax.transaction.SystemException不再在JDK9库中,但它在EE库中。 与在java.se.ee module-info中一样:

 @SuppressWarnings({"deprecation", "removal"}) @Deprecated(since="9", forRemoval=true) module java.se.ee { requires transitive java.se; // Upgradeable modules for Java EE technologies requires transitive java.activation; requires transitive java.corba; requires transitive java.transaction; requires transitive java.xml.bind; requires transitive java.xml.ws; requires transitive java.xml.ws.annotation; } 

但是对于模块java.transaction它只有: InvalidTransactionException, TransactionRequiredException, TransactionRolledbackException