Java EE и Jakarta EE: что это, история платформы и из чего она состоит

Java EE и Jakarta EE: что это, история платформы и из чего она состоит Полезное

Java EE (Java Platform, Enterprise Edition) — это набор спецификаций для серверных Java-приложений: веб-запросы, работа с базами данных, транзакции, обмен сообщениями, безопасность. С 2019 года платформа развивается в Eclipse Foundation под именем Jakarta EE, а ее API постепенно переехали из пакетов javax.* в jakarta.*.

Важно сразу развести три вещи. Java SE — сам язык, JVM и стандартная библиотека. Java EE / Jakarta EE — спецификации поверх Java SE. Сервер приложений (GlassFish, WildFly, Open Liberty и другие) — конкретная реализация этих спецификаций. Ниже — история платформы, ее состав, профили, связь со Spring и рабочий пример на Jakarta EE 11.

Мини-словарь: спецификация, API, реализация, профиль

Термин Что это Пример
Спецификация Документ, описывающий поведение и контракт Jakarta Servlet 6.1
API Интерфейсы и аннотации, по которым пишут код jakarta.servlet.http.HttpServlet
Реализация Код, который выполняет спецификацию Apache Tomcat, Eclipse GlassFish
Профиль Официальный поднабор спецификаций Web Profile, Core Profile

Аналогия-якорь: спецификация похожа на интерфейс в Java. Интерфейс сам ничего не делает, он задает контракт, а работу выполняют классы-реализации. Приложение, написанное по контракту, в идеале переносится между серверами. На практике переносимость ограничена: конфигурация, дескрипторы и расширения конкретного сервера обычно отличаются.

История: от J2EE до Jakarta EE 11

Версия Год Что важного
J2EE 1.2 1999 Первый релиз: сервлеты, JSP, EJB, JMS
J2EE 1.3 / 1.4 2001 / 2003 Развитие EJB, веб-сервисы
Java EE 5 2006 Новое имя без «2», аннотации, EJB 3, JPA
Java EE 6 2009 Web Profile, CDI, JAX-RS
Java EE 7 2013 WebSocket, JSON-P, Batch
Java EE 8 2017 Последняя версия под управлением Oracle
Jakarta EE 8 2019 Тот же API, что Java EE 8, пакеты еще javax.*
Jakarta EE 9 / 9.1 2020 / 2021 Переезд в jakarta.*, в 9.1 — поддержка Java 11
Jakarta EE 10 2022 Core Profile для микросервисов
Jakarta EE 11 2025 Минимум Java 17, Jakarta Data, поддержка виртуальных потоков

На сентябрь 2026 года актуальная версия — Jakarta EE 11 (полная платформа вышла 26 июня 2025 года). Jakarta EE 12 находится в разработке и еще не выпущена.

В 2017 году Oracle объявила о передаче Java EE в Eclipse Foundation. Код и спецификации передали, а товарный знак «Java» и право менять пакеты javax.* остались у Oracle. Поэтому платформа получила имя Jakarta EE, а новые версии API пришлось выпускать в пространстве jakarta.*.

Граница переименования: в jakarta.* переехали только пакеты enterprise-спецификаций. Пакеты Java SE вроде javax.crypto или javax.swing остались на месте, это часть JDK.

Минимальный пример: сервлет на Jakarta EE 11

Проверено 23.09.2026 в Apache Tomcat 11.0.26 на JDK 25 (Temurin). Tomcat реализует Servlet 6.1 из Jakarta EE 11. Сервлет отвечает на GET-запрос текстом и проверяет входной параметр:

import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        String name = req.getParameter("name");
        if (name == null || !name.matches("[\\p{L} -]{1,40}")) {
            name = "гость";
        }
        resp.setContentType("text/plain; charset=UTF-8");
        resp.getWriter().println("Привет, " + name + "!");
        resp.getWriter().println("Контейнер: " + getServletContext().getServerInfo());
        resp.getWriter().println("Servlet API: "
                + getServletContext().getMajorVersion() + "."
                + getServletContext().getMinorVersion());
    }
}

Компиляция и раскладка в приложение demo (внутри каталога Tomcat):

mkdir -p webapps/demo/WEB-INF/classes
javac -encoding UTF-8 -cp lib/servlet-api.jar -d webapps/demo/WEB-INF/classes HelloServlet.java
bin/catalina.sh start

Запрос /demo/hello?name=Анна (в URL имя передается в percent-кодировке) вернул статус 200 и такой ответ:

Привет, Анна!
Контейнер: Apache Tomcat/11.0.26
Servlet API: 6.1

Запрос с name=<script> не прошел проверку и получил «Привет, гость!», а несуществующий путь /demo/nope — статус 404.

Что здесь делает контейнер, а что код. Аннотация @WebServlet регистрирует класс на адресе /hello без файла web.xml. Контейнер сам создает экземпляр сервлета, разбирает HTTP-запрос и вызывает doGet. Код отвечает только за логику.

Проверка имени по шаблону — это валидация входа, а тип text/plain защищает от интерпретации ответа как HTML. Это разные меры, и для HTML-страниц все равно нужно кодирование вывода. Пример учебный: аутентификации, журналирования и ограничения частоты запросов в нем нет.

Ошибка: старый код с javax на новом сервере

Частая ситуация — взять пример из статьи 2015 года и собрать его на Tomcat 10+ или другом сервере Jakarta EE 9+. Тот же класс, но с импортами javax.servlet:

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

Результат компиляции против servlet-api.jar из Tomcat 11 (начало вывода javac):

HelloServlet.java:1: error: package javax.servlet.annotation does not exist
import javax.servlet.annotation.WebServlet;
                               ^
...
12 errors

Исправление — заменить javax.servlet на jakarta.servlet во всех импортах, а в сборке подключить API нужной версии Jakarta EE. Для больших проектов замену делают инструментами миграции, а не вручную. Сторонние библиотеки тоже должны быть собраны под jakarta.*, иначе ошибка переедет из компиляции в запуск.

Из чего состоит платформа

Спецификации удобно раскладывать по слоям типичного приложения. Список неполный, здесь основные:

Слой Спецификация Зачем
Веб Servlet, Pages (JSP), Faces (JSF) Обработка HTTP, серверные страницы и UI
Веб RESTful Web Services (JAX-RS) REST API на аннотациях
Логика CDI Внедрение зависимостей, жизненный цикл объектов
Логика Enterprise Beans (EJB) Транзакционные компоненты, исторический слой
Логика Bean Validation Правила проверки данных аннотациями
Данные Persistence (JPA) Отображение объектов на таблицы
Данные Transactions (JTA) Управление транзакциями
Интеграция Messaging (JMS), Connectors Очереди сообщений, подключение внешних систем

Отдельно о том, чего в современной платформе нет. Апплеты давно не запускаются браузерами, их API объявили устаревшим в Java 17 и удалили из JDK 26. Тексты, где апплеты названы частью Java EE, описывают платформу до 2010-х. JDBC — часть Java SE, а не Java EE, хотя серверы приложений дают для нее пулы соединений.

Профили и серверы приложений

Профиль С какой версии Для чего
Platform (полная) с начала Все спецификации, включая EJB, Messaging, Connectors
Web Profile Java EE 6 Веб-приложения: Servlet, CDI, JPA, JAX-RS и другие
Core Profile Jakarta EE 10 Микросервисы: CDI Lite, JAX-RS, JSON

Совместимые реализации проходят набор тестов TCK. Известные серверы: Eclipse GlassFish, WildFly (и коммерческий JBoss EAP), Open Liberty, Payara. Какой из них сертифицирован для конкретной версии и профиля, смотрят на официальной странице совместимости Eclipse Foundation на дату выбора.

Tomcat и Jetty — не полные серверы приложений. Это веб-контейнеры: они реализуют Servlet, Pages, Expression Language, WebSocket и часть смежных спецификаций. Для CDI или JPA к ним добавляют библиотеки, либо берут полный сервер.

Jakarta EE и Spring

Spring Framework — не реализация Jakarta EE, а отдельный фреймворк со своим контейнером внедрения зависимостей. При этом он опирается на отдельные спецификации Jakarta: Servlet для веб-слоя, Persistence через Hibernate, Bean Validation.

Поэтому переезд на jakarta.* затронул и Spring: Spring Framework 6 и Spring Boot 3 (2022) перешли на пакеты jakarta.* и требуют Java 17. Приложение на Spring Boot 2 при обновлении до 3.x проходит ту же миграцию импортов, что и классическое Java EE приложение.

Задача Что обычно берут
Новый сервис в команде со стеком Spring Spring Boot
Поддержка системы на WebLogic, WildFly, GlassFish Jakarta EE (или Java EE 8) на этом сервере
Микросервис на стандартах без привязки к вендору Core Profile или MicroProfile

Выбор зависит от команды и существующего кода, а не от «новизны». Знание Servlet, JPA, CDI и транзакций полезно в обоих мирах: Spring использует те же понятия.

Выводы

  • Java EE и Jakarta EE — одна линия развития: набор спецификаций серверной Java поверх Java SE, с 2019 года под управлением Eclipse Foundation.
  • Главное практическое изменение — переезд API из javax.* в jakarta.* в Jakarta EE 9; код со старыми импортами на новых серверах не собирается.
  • Спецификация задает контракт, сервер приложений или веб-контейнер его реализует; Tomcat покрывает веб-часть, а не всю платформу.
  • Профили (Platform, Web, Core) позволяют брать только нужный набор спецификаций.
  • Spring не реализует Jakarta EE, но использует ее отдельные спецификации и прошел ту же миграцию на jakarta.*.

Где применяется / связь с практикой

Jakarta EE и Java EE живут в банковских, страховых и государственных системах, где сервер приложений работает годами, а также в современных сервисах через Spring Boot, который опирается на те же Servlet, JPA и Bean Validation. Для разработчика это значит: понимать контейнер, транзакции и жизненный цикл компонентов приходится почти в любом серверном Java-проекте.

Освойте тему на практике

Если хочется довести эти знания до уровня рабочего сервиса на Spring Boot с базой данных и тестами, подойдет курс Разработчик на Spring Framework. Попробовать формат и темы бесплатно можно на открытых уроках Otus.

FAQ

Java EE умерла?
Название больше не развивается: последняя Java EE — версия 8. Платформа продолжается как Jakarta EE, а системы на Java EE 8 и Jakarta EE 8 по-прежнему эксплуатируются и мигрируют на новые версии.

Можно ли запустить старый WAR с javax.servlet на Tomcat 11?
Напрямую нет, классы javax.servlet там отсутствуют. Приложение пересобирают под jakarta.* или прогоняют через Apache Tomcat Migration Tool for Jakarta EE (в Tomcat 10+ та же конвертация срабатывает при копировании WAR в каталог webapps-javaee); второй путь подходит как временный.

Что такое MicroProfile и как он связан с Jakarta EE?
Это отдельный набор спецификаций Eclipse Foundation для микросервисов: конфигурация, проверки здоровья, телеметрия, отказоустойчивость. Начиная с MicroProfile 7.0 он объявляет Core Profile Jakarta EE своей зависимостью и дополняет его.

OTUS Журнал
Скидка 5% 12-19 октября на курсы (popup)
Бесплатные открытые уроки (поп-ап)