Logo programu | |
| Autor | Sun Microsystems (pierwotnie), Oracle (następnie), Eclipse Foundation (obecnie) |
|---|---|
| Pierwsze wydanie | grudzień 1999 (J2EE 1.2) |
| Aktualna wersja stabilna | 11 – 26 czerwca 2025; około rok temu |
| Rodzaj | specyfikacja platformy do tworzenia aplikacji serwerowych |
| Strona internetowa | |
Jakarta EE – zestaw otwartych specyfikacji i interfejsów programowania aplikacji (API) do tworzenia aplikacji serwerowych w Javie, w tym aplikacji internetowych i usług sieciowych. Wcześniej platforma nosiła nazwy Java Platform, Enterprise Edition (Java EE) oraz Java 2 Platform, Enterprise Edition (J2EE). Jakarta EE rozwija możliwości Java SE o ustandaryzowane mechanizmy obsługi żądań HTTP, komponentów biznesowych, dostępu do danych, transakcji, komunikacji asynchronicznej i bezpieczeństwa. Specyfikacje określają wymagane zachowanie poszczególnych technologii, natomiast działające implementacje dostarczają niezależni dostawcy oprogramowania; zgodność z wymaganiami specyfikacji jest weryfikowana m.in. przez zestawy testów TCK.
Platformę zapoczątkowała w 1999 roku firma Sun Microsystems jako J2EE. W 2006 roku przemianowano ją na Java EE. W 2017 roku firma Oracle zapowiedziała przekazanie rozwoju platformy do Eclipse Foundation, a w 2018 roku dla rozwijanego tam projektu przyjęto nazwę Jakarta EE. Zmiany te wiązały się także ze stopniową przebudową modelu programowania: od rozbudowanej architektury komponentowej i konfiguracji charakterystycznej dla wczesnych wersji J2EE do uproszczonych interfejsów API, adnotacji i mniejszych profili platformy.
Od 2018 roku rozwój platformy jest prowadzony w ramach Jakarta EE Working Group działającej przy Eclipse Foundation. W październiku 2026 roku najnowszym stabilnym wydaniem platformy jest Jakarta EE 11, opublikowane 26 czerwca 2025 roku, a wersja Jakarta EE 12 pozostaje w opracowaniu.
Rozwój J2EE poprzedzało powstawanie osobnych technologii serwerowych Javy. W latach 90. dynamiczne strony internetowe tworzono m.in. przy użyciu skryptów CGI. Serwlety umożliwiły obsługę żądań internetowych w środowisku Javy, a technologia JavaServer Pages (JSP) ułatwiła przygotowywanie generowanych po stronie serwera stron WWW. Równolegle rozwijano JDBC do komunikacji z bazami danych, Enterprise JavaBeans (EJB) do budowy komponentów logiki biznesowej oraz interfejsy do transakcji i komunikacji pomiędzy systemami.
Sun Microsystems przygotowało platformę Java 2 Platform, Enterprise Edition (J2EE), aby połączyć te mechanizmy w spójny zestaw specyfikacji i ujednolicić model uruchamiania aplikacji wielowarstwowych. Pierwsze wydanie, J2EE 1.2, zostało ogłoszone w grudniu 1999 roku. Obejmowało m.in. serwlety, JSP i EJB, a jego ważnym założeniem była możliwość łączenia aplikacji internetowych z istniejącymi systemami przedsiębiorstw.
J2EE oddzielało kod aplikacji od części jej infrastruktury. Programista mógł tworzyć serwlety obsługujące komunikację z przeglądarką, strony JSP generujące dynamiczną zawartość oraz komponenty EJB realizujące logikę biznesową. Zadania takie jak zarządzanie cyklem życia komponentów, bezpieczeństwo i koordynowanie transakcji miały być przejmowane przez tzw. kontenery udostępniane przez serwer. W założeniu miało to ułatwić przenoszenie aplikacji pomiędzy zgodnymi produktami różnych dostawców i ograniczyć zależność od ich własnych interfejsów.
Wczesny model J2EE był zorientowany na aplikacje korporacyjne podzielone na warstwy: klienta, część internetową, logikę biznesową i dostęp do systemów zaplecza. Wykorzystywał m.in. JDBC do pracy z bazami danych, JNDI do wyszukiwania zasobów oraz Java Transaction API (JTA) do transakcji. Ważną rolę odgrywały pliki konfiguracyjne XML, określające sposób wdrożenia komponentów na serwerze.
J2EE definiowało nie tylko poszczególne API, lecz także sposób ich współdziałania. Wspólne reguły obejmowały wyszukiwanie zasobów przez JNDI, konfigurowanie komponentów za pomocą deskryptorów wdrożenia oraz pakowanie aplikacji w postaci archiwów. Miało to umożliwiać uruchamianie oprogramowania na serwerach różnych producentów, pod warunkiem zgodności z wymaganiami platformy. Poszczególne specyfikacje rozwijano w ramach Java Community Process, a kompletne środowiska weryfikowano z użyciem testów zgodności.
J2EE 1.3, ukończone we wrześniu 2001 roku, rozbudowało możliwości integracji z zewnętrznymi systemami przedsiębiorstw. Wprowadzono wymaganie obsługi Java Message Service (JMS) i mechanizmy Connector Architecture pozwalające tworzyć adaptery do systemów zaplecza. Rozszerzono także EJB, m.in. o komponenty message-driven beans służące do asynchronicznej obsługi komunikatów, interfejsy lokalne oraz nowy model utrwalania danych zarządzany przez kontener. Wprowadzono ponadto obsługę przetwarzania XML poprzez JAXP.
J2EE 1.4 z 2003 roku położyło nacisk na usługi sieciowe wykorzystujące XML. Do platformy włączono m.in. JAX-RPC (wywołania zdalne oparte na XML) oraz SAAJ (obsługę komunikatów SOAP), a specyfikacja określała sposób udostępniania usług sieciowych przez komponenty aplikacji. Rozwijano także narzędzia wdrażania i zarządzania aplikacjami oraz standardowe mechanizmy autoryzacji.
Wczesne wydania J2EE oferowały bogatą funkcjonalność, lecz opracowywanie aplikacji mogło wymagać definiowania wielu interfejsów, klas pomocniczych i deskryptorów wdrożenia. Szczególnie widoczne było to w starszych modelach komponentów EJB. Uproszczenie tych mechanizmów stało się jednym z głównych celów kolejnej generacji platformy.
W pierwszej połowie lat 2000. część programistów kwestionowała złożoność tworzenia aplikacji opartych na EJB 2.x. Krytyka dotyczyła m.in. konieczności przygotowywania licznych interfejsów i plików konfiguracyjnych dla stosunkowo prostych komponentów. Rod Johnson, późniejszy twórca Spring Framework, opisywał te trudności na podstawie swoich doświadczeń z aplikacjami J2EE. Framework Spring, rozwijany niezależnie od specyfikacji J2EE, oferował m.in. wstrzykiwanie zależności oraz możliwość korzystania ze zwykłych obiektów Javy jako komponentów aplikacji.
Kolejne wersje standardu i rozwijane poza nim frameworki przyjmowały różne sposoby upraszczania aplikacji korporacyjnych. Zmiany w EJB 3.0 i wprowadzenie JPA w Java EE 5 ograniczyły liczbę wymaganych klas pomocniczych i deskryptorów XML, pozostawiając zarządzanie transakcjami czy bezpieczeństwem po stronie kontenera.
W maju 2006 roku ukazała się Java EE 5. Jednocześnie zrezygnowano z nazwy J2EE na rzecz Java Platform, Enterprise Edition (Java EE), usuwając cyfrę „2” z nazwy platformy. Jednym z zasadniczych celów wydania było zmniejszenie ilości kodu i konfiguracji potrzebnych do tworzenia aplikacji.
Java EE 5 szerzej wykorzystało adnotacje wprowadzone do języka Java w wersji 5. Dzięki nim wiele informacji o komponentach, zależnościach i konfiguracji mogło być umieszczanych bezpośrednio w kodzie źródłowym, a nie wyłącznie w plikach XML. Uproszczono EJB w wersji 3.0, wprowadzono Java Persistence API (JPA) dla mapowania obiektów na dane relacyjne oraz rozszerzono użycie wstrzykiwania zależności. Rozwijano także JavaServer Faces (JSF) i obsługę usług sieciowych JAX-WS.
Zmiany oznaczały odejście od części obowiązkowych wzorców charakterystycznych dla EJB 2.x. W wielu przypadkach komponent biznesowy mógł być zwykłą klasą Java opatrzoną odpowiednimi adnotacjami, a kontener zapewniał pozostałe usługi infrastrukturalne.
W Java EE 6 z grudnia 2009 roku wprowadzono Contexts and Dependency Injection (CDI), ujednolicające wstrzykiwanie zależności i zarządzanie kontekstami komponentów. Dodano mechanizm walidacji Bean Validation oraz ustandaryzowano w ramach platformy budowanie usług REST za pomocą JAX-RS. Po raz pierwszy wydzielono także Web Profile, obejmujący podzbiór technologii potrzebnych do tworzenia aplikacji internetowych bez konieczności implementowania całego standardu.
Java EE 7, zatwierdzone w maju 2013 roku, rozszerzyło obsługę technologii internetowych, m.in. o interfejsy API do komunikacji przez WebSocket, przetwarzania JSON i korzystania z klienta REST. Dodano mechanizmy przetwarzania wsadowego (Batch Applications) oraz zarządzanej współbieżności (Concurrency Utilities). Uproszczono także JMS w wersji 2.0 i rozbudowano CDI.
Ostatnim wydaniem platformy przygotowanym pod nazwą Java EE była Java EE 8 z 2017 roku. Wprowadziła ona interfejs JSON-B, mapujący dane JSON na obiekty Java, obsługę HTTP/2 w Servlet 4.0 i nowy interfejs API bezpieczeństwa Java EE Security. Rozszerzono również możliwości obsługi zdarzeń w CDI oraz usług REST, m.in. o server-sent events.
Po przejęciu Sun Microsystems przez Oracle w 2010 roku rozwój Java EE pozostawał w ramach procesu Java Community Process (JCP). We wrześniu 2017 roku Oracle ogłosiło zamiar przekazania rozwoju platformy organizacji Eclipse Foundation, z którą związano projekt Eclipse Enterprise for Java (EE4J). Przeniesienie obejmowało projekty implementacyjne, specyfikacje i zestawy testów zgodności.
W lutym 2018 roku, po głosowaniu społeczności, ogłoszono nową nazwę Jakarta EE. Nawiązywała ona do wcześniejszego projektu Apache Jakarta, rozwijanego w Apache Software Foundation, która zgodziła się na ponowne użycie nazwy. W głosowaniu uczestniczyło prawie 7000 osób, z których ponad 64% opowiedziało się za nazwą Jakarta EE. Litery „EE” w nowej nazwie nie stanowią oficjalnego rozwinięcia „Enterprise Edition”, lecz są elementem nazwy własnej, co wyjaśnił dyrektor wykonawczy Eclipse Foundation Mike Milinkovich.
Pierwszą wersją wydaną przez Eclipse Foundation jako Jakarta EE 8 było wydanie z 10 września 2019 roku. Zachowało ono zgodność interfejsów API z Java EE 8 i stanowiło punkt wyjścia do dalszego rozwoju projektu w nowym modelu organizacyjnym.
Jednym z celów zmian organizacyjnych była większa otwartość procesu standaryzacyjnego i szybszy rozwój specyfikacji. W dyskusjach nad dalszym kierunkiem platformy podkreślano znaczenie aplikacji uruchamianych w chmurze i architektury mikrousług. Rozwijany również w Eclipse Foundation projekt Eclipse MicroProfile koncentrował się na API dla takich zastosowań, pozostając odrębną inicjatywą wobec samej specyfikacji Jakarta EE.
Jedną z najważniejszych konsekwencji przekazania platformy były ograniczenia dotyczące użycia znaków towarowych i dotychczasowej przestrzeni nazw API. Po uzgodnieniach z Oracle społeczność projektu zdecydowała o przeniesieniu pakietów specyfikacji Jakarta EE z przestrzeni nazw javax.* do jakarta.*. Zmianę wprowadzono w Jakarta EE 9, opublikowanej 8 grudnia 2020 roku.
Modyfikacja dotyczyła m.in. nazw pakietów w kodzie źródłowym, deklaracji zależności, adnotacji, plików konfiguracji oraz bibliotek. Przykładowo klasa javax.servlet.http.HttpServlet z wcześniejszych wydań odpowiada klasie jakarta.servlet.http.HttpServlet w nowszych. Nie oznaczało to przeniesienia wszystkich pakietów zaczynających się od javax w całym ekosystemie Java, lecz tych należących do specyfikacji Jakarta EE. Jakarta EE 9 nie zachowało bezpośredniej zgodności kodu źródłowego ani kodu binarnego z poprzednimi wydaniami w zakresie zmienionych API.
Zmiana przestrzeni nazw wymagała aktualizacji importów klas i zależności bibliotek w aplikacjach przechodzących na nowe API. W przypadku starszego oprogramowania stosowano również narzędzia przekształcające kod lub pliki klas. Zgodność aplikacji zależy od użytych specyfikacji i możliwości środowiska uruchomieniowego, dlatego przejście na nowszą wersję serwera nie zawsze wymaga identycznego zakresu zmian.
W Jakarta EE 9.1 z maja 2021 roku rozszerzono obsługę platformy o środowisko uruchomieniowe Java SE 11, bez wprowadzania zasadniczych zmian w interfejsach API względem wersji 9.
Jakarta EE 10, wydane we wrześniu 2022 roku, wprowadziło istotne aktualizacje specyfikacji składowych oraz Core Profile, mniejszy zestaw interfejsów API przeznaczony do wykorzystania w lekkich środowiskach uruchomieniowych i aplikacjach opartych na mikrousługach. W tej wersji zrezygnowano także ze wsparcia Java SE 8 jako podstawy platformy.
Jakarta EE 11, ogłoszone 26 czerwca 2025 roku, dodało specyfikację Jakarta Data do definiowania warstwy dostępu do danych z wykorzystaniem interfejsów repozytoriów. Wprowadzono aktualizacje m.in. Jakarta Persistence, Validation, CDI i Concurrency, w tym obsługę wybranych zastosowań rekordów Javy i wątków wirtualnych w środowiskach opartych na Java 21. Minimalną wersją Java SE wymaganą przez platformę stała się Java 17. Z zestawu specyfikacji platformy usunięto Jakarta Managed Beans, Jakarta SOAP with Attachments, Jakarta XML Binding i Jakarta XML Web Services. Trzy ostatnie specyfikacje były już opcjonalne w Jakarta EE 10; ich wycofanie z platformy nie oznacza zaprzestania rozwoju samodzielnych implementacji.
Jakarta EE nie jest pojedynczym programem ani serwerem, lecz zbiorem wymagań określających zachowanie zgodnych implementacji. Definiuje kontrakty pomiędzy komponentami aplikacji a środowiskiem uruchomieniowym, pozwalając aplikacjom korzystać z usług kontenera bez bezpośredniego implementowania mechanizmów infrastruktury. Specyfikacja nie narzuca jednego sposobu rozmieszczenia wszystkich elementów systemu: mogą one działać na pojedynczym serwerze lub na wielu maszynach.
Klasyczny model wielowarstwowy wywodzący się z J2EE wyróżnia:
Współczesne aplikacje Jakarta EE nie muszą stosować wszystkich tych warstw jako oddzielnych programów. Mogą wykorzystywać wybrane specyfikacje w jednej aplikacji internetowej albo w zestawie usług komunikujących się przez sieć.
Kontener to część środowiska uruchomieniowego zapewniająca komponentom zestandaryzowane usługi. Historycznie J2EE rozróżniało m.in. kontener WWW dla serwletów i JSP oraz kontener EJB dla komponentów biznesowych. Wspólne usługi obejmowały zarządzanie cyklem życia, udostępnianie zasobów, bezpieczeństwo, transakcje i komunikację pomiędzy elementami aplikacji.
Konfiguracja tych usług może być określana deklaratywnie, m.in. przy użyciu adnotacji Java i deskryptorów wdrożenia. Dzięki temu programista może opisywać wymagane zachowanie, np. udział metody w transakcji lub ograniczenie dostępu do zasobu, bez implementowania całej obsługi tych funkcji w kodzie aplikacji.
W modelu J2EE i Java EE komponenty pakowano do standaryzowanych archiwów. Pliki WAR (Web Application Archive) zawierają aplikacje internetowe, JAR (Java Archive) mogą zawierać m.in. komponenty biznesowe, a EAR (Enterprise Archive) służą do łączenia wielu modułów aplikacji przedsiębiorstwa. Ustawienia wdrożeniowe mogły być przechowywane w plikach XML, takich jak web.xml lub application.xml. W nowszych wydaniach wiele takich ustawień można zastąpić adnotacjami.
Specyfikacje tworzące platformę ewoluowały od czasów J2EE. Część dawnych interfejsów zmieniła nazwy, a niektóre wycofano z obowiązkowego zestawu. Poniższe technologie należą do najważniejszych elementów współczesnej Jakarta EE lub jej historii; szczegółowy zakres zależy od wersji i profilu platformy.
Nie wszystkie wymienione interfejsy są wymagane w każdym profilu Jakarta EE. Część specyfikacji jest używana również samodzielnie, poza kompletnym serwerem aplikacji.
Aby dostosować zakres wymaganych funkcji do różnych zastosowań, specyfikacja definiuje pełną platformę i dwa mniejsze profile:
Poniższe zestawienie przedstawia kolejne wersje platformy i główne zmiany w ich specyfikacjach.
| Nazwa i wersja | Rok | Główne zmiany |
|---|---|---|
| J2EE 1.2 | 1999 | Pierwsza generacja zintegrowanej platformy przedsiębiorstwa, obejmująca m.in. Servlet, JSP i EJB. |
| J2EE 1.3 | 2001 | Rozbudowa EJB, obowiązkowa obsługa JMS i integracja poprzez Connector Architecture. |
| J2EE 1.4 | 2003 | Szersza obsługa usług sieciowych XML, JAX-RPC i SOAP. |
| Java EE 5 | 2006 | Zmiana nazwy, adnotacje, EJB 3.0 i Java Persistence API. |
| Java EE 6 | 2009 | CDI, Bean Validation, JAX-RS i Web Profile. |
| Java EE 7 | 2013 | WebSocket, JSON-P, API przetwarzania wsadowego i zarządzanej współbieżności. |
| Java EE 8 | 2017 | JSON-B, Servlet 4.0, obsługa HTTP/2 i Java EE Security. |
| Jakarta EE 8 | 2019 | Pierwsze wydanie pod nową nazwą, zachowujące zgodność API z Java EE 8. |
| Jakarta EE 9 | 2020 | Przeniesienie interfejsów API specyfikacji z javax.* do jakarta.*. |
| Jakarta EE 9.1 | 2021 | Dodanie obsługi Java SE 11. |
| Jakarta EE 10 | 2022 | Rozbudowa specyfikacji i wprowadzenie Core Profile. |
| Jakarta EE 11 | 2025 | Jakarta Data, modernizacja API i testów zgodności; minimalnie Java SE 17. |
Przykładami środowisk realizujących specyfikacje Jakarta EE są Eclipse GlassFish, WildFly, Open Liberty i Payara Server. Poszczególne wydania serwerów mogą obsługiwać różne wersje standardu i różne profile. Korzystanie z pojedynczych bibliotek zawierających interfejsy Jakarta EE nie oznacza automatycznie, że całe środowisko spełnia wymagania pełnej platformy.
Do weryfikowania zgodności służą zestawy testów Technology Compatibility Kit (TCK). Testy sprawdzają, czy implementacja spełnia wymagania odpowiednich specyfikacji, profilu albo całej platformy. Ich przejście stanowi podstawę programu Jakarta EE Compatible prowadzonego przez Eclipse Foundation.