Hibernate 5 проблема с JDK 9
У меня есть проект Hibernate 5, который прекрасно собирается и работает на Java 8. Я пытался протестировать его на JDK 9 ea build 171. Поскольку это огромный проект и у меня есть другие зависимости, мне пришлось добавить java.xml.bind
Модуль для конфигурации JVM для тестов:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
<argLine>--add-modules java.xml.bind</argLine>
</configuration>
</plugin>
Были и другие проблемы, которые я мог решить, но если бы использовался агрегированный модуль java.se.ee(как рекомендовано):
<argLine>--add-modules java.se.ee</argLine>
Я получил исключение:
java.lang.NoClassDefFoundError: javax/transaction/SystemException
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:374)
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)
Я даже не мог понять, почему это произошло, потому что библиотека JTA (с SystemException
class) находится в class-path, когда тесты были запущены.
Любые предложения о том, как это исправить?
2 ответа
Хотя вопрос кажется старым, но без ответа, и поскольку выпуск GA JAK завершен. Согласно руководству по миграции и документам Java, так как модуль java.transaction
который экспортирует посылку javax.transaction
был отмечен как @Deprecated
,
В идеале вы должны перенести ваш код, чтобы использовать вместо него https://github.com/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;
Редактировать: Спасибо @ImpulseTheFox за проверку того, что автоматическое имя модуля для jar версии 1.3 выше требует: -
requires java.transaction;
Java SE определяет небольшое подмножество JTA. Он не включает javax.transaction.SystemException, поскольку это исключение содержится в версии JTA для Java EE, а не в подмножестве Java SE.
Когда вы бежите с --add-modules java.se.ee
затем это приводит к тому, что модули, совместно используемые между Java SE и Java EE, должны быть разрешены, включая модуль java.transaction. Любая попытка загрузить тип в пакете javax.transaction будет загружена из модуля java.transaction, но так как этот модуль имеет только небольшое подмножество JTA, то исключение javax.transaction.SystemException не будет найдено.
Если вы уронили --add-modules java.se.ee
из командной строки вы обнаружите, что javax.transaction.SystemException может быть загружен, так как он находится на пути к классам. Поэтому, если вам нужен только JAXB (модуль java.xml.bind), укажите этот модуль для --add-modules
а не агрегатор "java.se.ee", который приведет к разрешению всех модулей, совместно используемых с Java EE.