Доброе утро!
В связи с изменениями в политике 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.