복붙노트

[SPRING] 최대 절전 모드, Java 9 및 SystemException

SPRING

최대 절전 모드, Java 9 및 SystemException

나는 Java 9 / Spring Boot 1.5.x / Maven 프로젝트에서 최대 절전 모드 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 특정 코드가 없습니다.

해결법

  1. ==============================

    1.마이그레이션 가이드와 java 문서에 따르면, javax.transaction 패키지를 내보내는 모듈 java.transaction이 @Deprecated로 표시 되었기 때문입니다.

    마이그레이션 가이드와 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을 사용하는 동안 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 확인 후")

    다른 한편, 일시적인 해결 방법 (결국이 모듈들은 JDK에서 제거 될 것이기 때문에)을 사용하는 것이 가능할 수 있습니다 :

    --add-modules java.transaction
    

    코멘트에서 언급했듯이 javax.transaction-api에 대한 필수 종속성은 클래스 경로에서 이미 사용 가능하므로 컴파일러 옵션을 추가하지 않아도됩니다. 그렇지 않으면 현재 패키지를 java.transaction 모듈로 덮어 쓰게됩니다. 이상적으로 사용 사례에 해당하는 javax.transaction 패키지가 SystemException으로 구성되지 않습니다.

  2. ==============================

    2.이것이 내가 생각하는 것입니다. --add-modules java.eth.ee는 기본적으로 해결되지 않은 Java EE로 공유되는 모듈에 따라 내부 API를 해결하는 데 사용되는 모든 Java EE 모듈을 해결합니다. 따라서 개발자는 특정 모듈을 하나씩 추가 할 필요가 없습니다. 한편, JDK9는 SE와 EE를 분리합니다. javax.transaction.SystemException은 더 이상 JDK9 라이브러리에 없지만 EE 라이브러리에 있습니다. java.se.ee 모듈 정보에서와 같이 :

    이것이 내가 생각하는 것입니다. --add-modules java.eth.ee는 기본적으로 해결되지 않은 Java EE로 공유되는 모듈에 따라 내부 API를 해결하는 데 사용되는 모든 Java EE 모듈을 해결합니다. 따라서 개발자는 특정 모듈을 하나씩 추가 할 필요가 없습니다. 한편, JDK9는 SE와 EE를 분리합니다. javax.transaction.SystemException은 더 이상 JDK9 라이브러리에 없지만 EE 라이브러리에 있습니다. java.se.ee 모듈 정보에서와 같이 :

    @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

  3. from https://stackoverflow.com/questions/46515230/hibernate-java-9-and-systemexception by cc-by-sa and MIT license