null

Spring Boot: java 8 → Java 11

Доброе утро!

В связи с изменениями в политике Oracle по отношению к java 8, выходом LTS-выпуска java 11 и разваливающимся приложением при попытке "в тупую" запустить его на новой джаве, я решил написать данную заметку по миграции.

Что было: приложение, собираемое maven, spring-boot версии 1.5.6.RELEASE, java.version 1.8.

Теперь о том, что стало.

Java 11 полноценно поддерживается в spring-boot 2.1.x. На момент написания статьи актуальная версия — 2.1.6.RELEASE. Таким образом, в pom.xml появляется следующий блок:

     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.1.6.RELEASE</version>
         <relativePath/>
     </parent>

spring-boot-starter-parent сам разберётся в версиях зависимостей, подтянув пятый spring вместо четвёртого.

Кроме того, предлагаю обновить maven-compiler-plugin до 3.8.1 и maven-surefire-plugin до 2.22.2. Они вполне хорошо себя чувствуют в одиннадцатой джаве.

Также стоит отметить, что если используется spring-data с hibernate и javax.validation.validation-api, то последняя пара теряет совместимость. Таким образом, уместна подобная правка:

         <dependency>
             <groupId>javax.validation</groupId>
             <artifactId>validation-api</artifactId>
-            <version>1.1.0.Final</version>
+            <version>2.0.1.Final</version>
         </dependency>

Ну и не забываем сменить java.version на 11.

 

Теперь стоит попробовать это собрать в при помощи java 11. Вероятно, у вас не получилось. Часть классов сменила пакеты. Пример:

-import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

Устранить это легко — ищем документацию по spring boot 2.1.6 на этот класс, смотрим новое имя пакета, правим. В моём случае этого оказалось достаточно.

 

Когда всё собралось и запустилось, в логах можно заметить следующее предупреждение:

15:50:28.839 [WARN ] aWebConfiguration$JpaWebMvcConfiguration:225  - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning

Это сигнализирует о включенности настройки hibernate Open Session In View. Зачем оно надо, чем хорошо и чем плохо рассказывается, например, здесь. Для себя мы проблемы LazyInitializationException давно решили при помощи @EntityGraph над нужными запросами, так что данная опция акутальной в проектах не является. Отключить её можно добавлением application.properties строки spring.jpa.open-in-view=false.

На этом всё, буду обновлять данную статью, если столкнусь ещё с какими-то проблемами при миграции spring-boot приложений на java 11.