2017-10-01 108 views
5

Próbowałem uruchomić hibernacji 5.2.11 aplikacji w Javie 9/wiosna/Boot 1.5.x projekt Maven ale ja nie ustanawiając przy brakującym Klasa:Hibernate, Java 9 i SystemException

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 

Has ktoś napotkał ten wyjątek i zna obejście? Próbowałem dodać --add-modules dla javax.bind lub java.se.ee, ale one nie pomogły.

Powyższy błąd pojawia się w przypadku testu integracyjnego mavan-failsafe (2.20.1), który uruchamia kontekst wiosny z Hibernate. Aplikacja nie ma żadnego specyficznego kodu Java 9.

+1

ja wykorzystuje failsafe 2.20.1 –

+3

Nie wiem nic o wtyczce failsafe, ale nastąpiła ostatnia zmiana wtyczki surefire, w której zmieniono ją na "--add-modules java.se.ee", co było niewłaściwą rzeczą przy próbie nadpisania standardowy moduł z wersją Java EE komponentu. Występuje problem z śledzeniem tego dla wtyczki surefire (https://issues.apache.org/jira/browse/SUREFIRE-1424). –

+0

@AlanBateman Dzięki, dziwnie nie działa z javax.xml.indem w przypadku 2.20 (i 2.19.1), chociaż mam '--add-modules java.xml.bind' dodany –

Odpowiedz

2

Według oraz docs Java migration guide, ponieważ moduł java.transaction która eksportuje pakiet javax.transaction została oznaczona jako @Deprecated.

Zamiast tego należy idealnie zmigrować swój kod, aby korzystać z wersji javaee/javax.transaction. Obecnie można to zrobić za pomocą automatyczny moduł przeliczona z zależnością:

<dependency> 
    <groupId>javax.transaction</groupId> 
    <artifactId>javax.transaction-api</artifactId> 
    <version>1.2</version> 
</dependency> 

i dodanie do module-info.java następujące: -

requires javax.transaction.api; 

Dodatkowo podczas korzystania z maven-failsafe-plugin, upewnij się, używasz minimalnej zgodnej wersji 2.20.1 lub nowszej, jak wspomniano w

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-failsafe-plugin</artifactId> 
    <version>2.20.1</version> 
</plugin> 

@Deprecated (forRemoval = "po potwierdzeniu OP")

Z drugiej strony, temporary workaround (ponieważ ostatecznie moduły te zostaną usunięte z JDK) mogłoby być wykorzystanie : -

--add-modules java.transaction 

Jak wspomniano w komentarzach, ponieważ wymagana zależność dla javax.transaction-api jest już dostępna na ścieżce klasy, nie powinno być wymagane, aby dodać dowolną opcję kompilatora lub w przeciwnym razie zmieniłbyś bieżący pakiet z wyeksportowanego pakietu java.transactionjavax.transaction, który idealnie do Twojego przypadku użycia nie składa się z SystemException.

+0

Otrzymuję ten sam błąd z tą zależnością (i puste '--add-modules') –

+0

Nie dodaję żadnego modułu, wystarczy uruchomić aplikację działającą na Java 8, aby uruchomić na Java 9. –

+1

@ KrzysztofKrasoń It's nie twój konkretny kod, ale Java 9, która oznacza tę funkcję jako nieaktualną. – nullpointer

0

To jest to, co myślę: --add-modules java.se.ee według Modules Shared with Java EE Not Resolved by Default rozwiąże wszystkie moduły Java EE wykorzystywane do rozwiązywania wewnętrzne API. Dlatego programiści nie muszą dodawać poszczególnych modułów jeden po drugim. Z drugiej strony JDK9 oddziela EE od SE. javax.transaction.SystemException nie jest już w bibliotece JDK9, ale znajduje się w bibliotece EE. Jak w 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; 

} 

Ale dla modułu java.transaction ma tylko: InvalidTransactionException, TransactionRequiredException, TransactionRolledbackException