【问题标题】:Hibernate, Java 9 and SystemException休眠、Java 9 和 SystemException
【发布时间】:2018-03-12 22:01:21
【问题描述】:

我一直在尝试在 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 特定代码。

【问题讨论】:

  • 我使用故障保护 2.20.1
  • 我对故障安全插件一无所知,但最近对surefire插件进行了更改,将其更改为使用--add-modules java.se.ee,当试图用组件的 Java EE 版本。为 surefire 插件 (issues.apache.org/jira/browse/SUREFIRE-1424) 跟踪此问题存在问题。
  • @AlanBateman 谢谢,奇怪的是 javax.xml.bind 在 2.20(和 2.19.1)的情况下失败了,尽管我添加了 --add-modules java.xml.bind
  • 我得到这个工作的唯一方法是阅读艾伦的评论。
  • 我在 9+181 上使用 maven 的唯一方法是阅读 Alan 的评论并将 maven surefire 插件从 2.20.1 降级到 2.20,但我仍然需要对 javax.xml 的 maven 依赖。绑定:jaxb-api:2.2.11。顺便说一下,Eclipse (Oxygen 1a) JUnit 插件可以在将 java.se.ee 模块添加到 java 构建路径对话框中显式包含的模块窗格中运行我的测试,该对话框在 JRE 系统中编辑“Is Modular”后打开图书馆 9 树。

标签: java spring hibernate maven java-9


【解决方案1】:

这是我的想法:--add-modules java.se.ee 根据Modules Shared with Java EE Not Resolved by Default 将解析所有 Java EE 模块,用于解析internal APIs。因此,开发者无需一一添加具体的模块。另一方面,JDK9 也将 EE 与 SE 分开。 javax.transaction.SystemException 不再在 JDK9 库中,但在 EE 库中。如java.se.eemodule-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

【讨论】:

    【解决方案2】:

    根据migration guide 和java 文档,由于导出包javax.transaction 的模块java.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 时,请确保您使用2.20.1 或以上progress document of Maven. 中提到的最低兼容版本

    <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
    

    正如 cmets 中所述,由于 javax.transaction-api 所需的依赖项已在类路径中可用,因此您不需要添加任何编译器选项,否则您最终会用 java.transaction 覆盖当前包模块导出的 javax.transaction 包,理想情况下,它不包含 SystemException

    【讨论】:

    • 我得到与该依赖项相同的错误(并且为空--add-modules
    • @KrzysztofKrasoń 这不是您的特定代码,而是 Java 9,将该功能标记为已弃用。
    • @KrzysztofKrasoń 如果是这种情况,理想的解决方案应该是迁移到答案中提到的 javaee/javax.transaction 工件。
    • 是的,当我 import javax.transaction.SystemException 时,项目编译得很好(通过编译、testCompile、测试阶段,在集成测试阶段失败)
    • 在这种情况下应该可以解决您的问题,因为带有 SystemException 的包已经在您的类路径中可用。添加--add-modules 将使用自己的实现覆盖该包,该实现没有所需的类。
    猜你喜欢
    • 2018-06-22
    • 2018-09-10
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多