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.

Другие вопросы по тегам