Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Мигрируй это!

Мигрируй это!

Платформа Java Enterprise эволюционирует, меняется, и уже скоро Jakarta EE придёт в существующие проекты, которым потребуется миграция на новый API. Мы поговорим о предстоящих изменениях в коде, о том как их можно сделать вручную и о том, как этого избежать. Посмотрим на IntelliJ IDEA как на фреймворк для автоматического рефакторинга, напишем плагин для IDE и заставим роботов делать скучную работу вместо нас.

Yuriy Artamonov

March 31, 2021
Tweet

More Decks by Yuriy Artamonov

Other Decks in Programming

Transcript

  1. Автор ты кто Юрий Артамонов @jreznot ▪ Разрабатывал фреймворки и

    библиотеки для Java на протяжении 9 лет ▪ Придумываю новые возможности IDE для ваших любимых JVM фреймворков в IntelliJ IDEA ▪ Беспристрастный член ПК конференций Joker/JPoint 2
  2. План действий 1. А что там мигрировать 2. Грубая сила

    3. Мягкая сила 4. Приручаем IDE 5. Сходим с ума 3
  3. История вопроса > At JavaOne 2017 Oracle announced that they

    would start the difficult process of moving Java EE to the Eclipse Software Foundation. <…> Mike Milinkovich from Eclipse informed that Eclipse and Oracle could not come to an agreement that would allow Jakarta EE to evolve using the existing javax package prefix. https://www.eclipse.org/community/eclipse_newsletter/201 9/november/7.php 4
  4. Ожидания Jakarta EE сможет беспрепятственно использоваться если: ▪ Существующие приложения

    должны продолжить работу без изменений ▪ Существующий исходный код должен продолжить работать без изменений ▪ Должны быть созданы инструменты для миграции импортов ▪ Приложения, использующие новые API должны иметь возможность использовать библиотеки, не получившие обновлений 5
  5. Масштаб трагедии ▪ Зависимости на javax.inject, javax.persistence, javax.ws.rs… ▪ Популярные

    библиотеки: Jersey, REST Easy, Hibernate, Weld, ActiveMQ, RabbitMQ… ▪ Spring Framework - 2545 Java EE imports ▪ Application Servers: Tomcat, Jetty, GlassFish, WebLogic, Wilfly, OpenLiberty ▪ Cloud APIs совместимые с JMS 6
  6. Что нужно мигрировать ▪ Посмотреть пристальным взглядом на зависимости ▪

    Обновить зависимости в pom.xml ▪ Поправить импорты javax.* ▪ Заменить пространства имён в XML конфигурации ▪ Переименовать свойства javax.* https://www.agilejava.eu/2021/01/22/migration-guide/ 7
  7. Давайте Search-Replace жахнем! Варианты: 1. Replace in Files + Regex

    2. Replace Structurally... Многовато будет запусков! 9
  8. Какие есть инструменты ▪ Tomcat Migration Tool for Jakarta EE

    github.com/apache/tomcat-jakartaee-migration (брутальные регулярные выражения) ▪ Eclipse Transformer project github.com/eclipse/transformer (байткод процессор) ▪ IntelliJ IDEA ! 11
  9. Tomcat Migration Tool - EESpecProfile 12 public enum EESpecProfile {

    TOMCAT("javax([/\\.](annotation(?![/ \\.]processing)" + "|ejb" + "|el" + "|mail" + "|persistence" + "|security[/\\.]auth[/\\.]message" + "|servlet" + "|transaction(?![/ \\.]xa)" + "|websocket))" ), EE("javax([/\\.](activation" + "|annotation(?![/ \\.]processing)" + "|batch" + "|decorator" + "|ejb" + "|el" + "|enterprise" + "|faces" +
  10. Потеря-потерь Specifications Pruned in Jakarta EE 9: ▪ Jakarta XML

    Registries ▪ Jakarta XML RPC ▪ Jakarta Deployment ▪ Jakarta Management eclipse-ee4j.github.io/jakartaee-platform/jakartaee9/JakartaEE9ReleasePlan 13
  11. Как создать плагин 14 1. Проверить/включить Plugin DevKit 2. Создать

    Gradle проект с библиотекой IntelliJ Platform Plugin 3. Объявить и реализовать нужные точки расширения
  12. Ключевые внутренности IDE ▪ Компоненты и сервисы ▪ Виртуальная файловая

    система (VFS) ▪ Поддержка языков (PSI) ▪ Редактор кода ▪ Инспекции ▪ Индексы ▪ Фоновые процессы ▪ UI библиотека ▪ Точки расширения IntelliJ Platform IDEA CE (Java, Groovy, Kotlin) PHP Support Ruby Support IDEA Ultimate PHP Storm RubyMine 15
  13. Refactor - Migrate… Стандартная возможность IntelliJ IDEA (CE и Ultimate)

    Варианты: 1. Вызвать UI, добавить пакеты и классы для миграции 2. Создать конфигурационный файл в плагине 16 <migrationMap> <name value="Java EE 8 to Jakarta EE 9" /> <entry oldName="javax.inject" newName="jakarta.inject" type="package" recursive="true" /> <entry oldName="javax.ws.rs" newName="jakarta.ws.rs" type="package" recursive="true" /> <entry oldName="javax.enterprise" newName="jakarta.enterprise" type="package" recursive="true" /> <entry oldName="javax.persistence" newName="jakarta.persistence" type="package" recursive="true" /> </migrationMap>
  14. Internal Mode Специальный режим работы IDE, в котором доступны опции

    для разработчиков. ▪ Internal Actions ▪ View PSI / Dump UAST ▪ Dumb Mode Switch ▪ … Автоматически доступен в режиме отладки плагина. Включить в VM Options своей IDE: -Didea.is.internal=true 17
  15. PSI Viewer Tools - View PSI Structure of Current File

    Позволяет изучить структуру PSI дерева в файле: ▪ PSI Tree ▪ References ▪ Language injections 18
  16. Куда копать дальше ▪ Исходный код IntelliJ IDEA CE: github.com/JetBrains/intellij-community

    ▪ Документация Plugin DevKit: jetbrains.org/intellij/sdk/docs/basics.html ▪ Slack: jetbrains-platform NEW! https://plugins.jetbrains.com/slack 19