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. Мигрируй это!
    Юрий Артамонов

    View Slide

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

    View Slide

  3. План действий
    1. А что там мигрировать
    2. Грубая сила
    3. Мягкая сила
    4. Приручаем IDE
    5. Сходим с ума
    3

    View Slide

  4. История вопроса
    > 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

    View Slide

  5. Ожидания
    Jakarta EE сможет беспрепятственно использоваться если:
    ■ Существующие приложения должны продолжить работу без изменений
    ■ Существующий исходный код должен продолжить работать без
    изменений
    ■ Должны быть созданы инструменты для миграции импортов
    ■ Приложения, использующие новые API должны иметь возможность
    использовать библиотеки, не получившие обновлений
    5

    View Slide

  6. Масштаб трагедии
    ■ Зависимости на 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

    View Slide

  7. Что нужно мигрировать
    ■ Посмотреть пристальным взглядом на зависимости
    ■ Обновить зависимости в pom.xml
    ■ Поправить импорты javax.*
    ■ Заменить пространства имён в XML конфигурации
    ■ Переименовать свойства javax.*
    https://www.agilejava.eu/2021/01/22/migration-guide/
    7

    View Slide

  8. Модельное приложение
    Крошечное приложение на Java EE 8:
    ■ CDI
    ■ JPA
    ■ Bean Validation
    ■ JAX-RS
    ■ EJB
    8

    View Slide

  9. Давайте Search-Replace жахнем!
    Варианты:
    1. Replace in Files + Regex
    2. Replace Structurally...
    Многовато будет запусков!
    9

    View Slide

  10. А что-то не переехало
    ■ javax.sql.*
    ■ javax.transaction.xa.*
    ■ javax.xml.*
    ■ javax.naming.*
    ■ javax.swing.*
    10

    View Slide

  11. Какие есть инструменты
    ■ Tomcat Migration Tool for Jakarta EE
    github.com/apache/tomcat-jakartaee-migration
    (брутальные регулярные выражения)
    ■ Eclipse Transformer project
    github.com/eclipse/transformer
    (байткод процессор)
    ■ IntelliJ IDEA !
    11

    View Slide

  12. 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" +

    View Slide

  13. Потеря-потерь
    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

    View Slide

  14. Как создать плагин
    14
    1. Проверить/включить
    Plugin DevKit
    2. Создать Gradle проект с
    библиотекой
    IntelliJ Platform Plugin
    3. Объявить и реализовать
    нужные точки
    расширения

    View Slide

  15. Ключевые внутренности IDE
    ■ Компоненты и сервисы
    ■ Виртуальная файловая система (VFS)
    ■ Поддержка языков (PSI)
    ■ Редактор кода
    ■ Инспекции
    ■ Индексы
    ■ Фоновые процессы
    ■ UI библиотека
    ■ Точки расширения
    IntelliJ Platform
    IDEA CE (Java,
    Groovy, Kotlin)
    PHP Support Ruby Support
    IDEA Ultimate PHP Storm RubyMine
    15

    View Slide

  16. Refactor - Migrate…
    Стандартная возможность
    IntelliJ IDEA (CE и Ultimate)
    Варианты:
    1. Вызвать UI, добавить пакеты и
    классы для миграции
    2. Создать конфигурационный
    файл в плагине
    16


    newName="jakarta.inject"
    type="package" recursive="true" />
    newName="jakarta.ws.rs"
    type="package" recursive="true" />
    newName="jakarta.enterprise"
    type="package" recursive="true" />
    newName="jakarta.persistence"
    type="package" recursive="true" />

    View Slide

  17. Internal Mode
    Специальный режим работы IDE, в котором доступны опции для
    разработчиков.
    ■ Internal Actions
    ■ View PSI / Dump UAST
    ■ Dumb Mode Switch
    ■ …
    Автоматически доступен в режиме отладки плагина.
    Включить в VM Options своей IDE: -Didea.is.internal=true
    17

    View Slide

  18. PSI Viewer
    Tools - View PSI Structure of Current File
    Позволяет изучить структуру PSI
    дерева в файле:
    ■ PSI Tree
    ■ References
    ■ Language injections
    18

    View Slide

  19. Куда копать дальше
    ■ Исходный код 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

    View Slide

  20. Вопросы ?
    Код: github.com/jreznot/jakartaee-migrator
    Twitter:
    @Yuriy_Artamonov

    View Slide