# Jakarta EE

Jakarta EE, früher Java Platform, Enterprise Edition (Java EE), ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Webanwendungen. Sie ist eine der großen Plattformen, die um den Middleware-Markt kämpfen. Größter Konkurrent ist dabei die .NET-Plattform von Microsoft.
In der Spezifikation werden Softwarekomponenten und Dienste definiert, die hauptsächlich in der Programmiersprache Java erstellt werden. Die Spezifikation dient dazu, einen allgemein akzeptierten Rahmen zur Verfügung zu stellen, um auf dessen Basis aus modularen Komponenten verteilte, mehrschichtige Anwendungen entwickeln zu können. Klar definierte Schnittstellen zwischen den Komponenten und Containern sollen dafür sorgen, dass Softwarekomponenten unterschiedlicher Hersteller interoperabel sind, wenn sie sich an die Spezifikation halten, und dass die verteilte Anwendung gut skalierbar ist.
Bestandteile der "Java Platform, Enterprise Edition" Spezifikation wurden innerhalb des Java Community Process von diversen Unternehmen erarbeitet und schließlich der Öffentlichkeit in Form eines Dokuments und einer Referenzimplementierung zur Verfügung gestellt. Zukünftige Spezifikationen werden als Eclipse Jakarta EE Platform im Rahmen des Eclipse Foundation Projektes EE4J, einschließlich Referenzimplementierung, Technology Compatibility Kit (TCK) und Tutorial zur Verfügung gestellt.

## Bisherige Versionen
### Eclipse Jakarta EE Platform - Versionen Eclipse EE4J

Die "Java Platform, Enterprise Edition, v 8", einschließlich Technology Compatibility Kit (TCK) und Referenzimplementierung GlassFish, wurde der Eclipse Foundation von Oracle übergeben und dort das Projekt EE4J gegründet. Dieses entwickelt, stimmt ab und veröffentlicht die Eclipse Jakarta EE Platform.
Die Eclipse Foundation und Oracle hatten damals keine Vereinbarung zu den Namensrechten an Java und dem damit verbundenen technischen Namensraum getroffen, was 2019 durch die Umbenennung der Version in Jakarta gelöst wurde.

### Java Platform, Enterprise Edition - Versionen Java Community Process unter Leitung Oracle

Bis einschließlich zur Version 8 wurde die Java EE Plattform mit dem Java Community Process unter der Spezifikationsleitung von Oracle entwickelt, abgestimmt und veröffentlicht. Weitere Versionen werden mit diesem Prozess und unter dieser Leitung nicht erscheinen.
Die letzte Version der Java-EE-Spezifikation ist die Version 8.0.
Der neue Name für die Spezifikation lautet Java Platform, Enterprise Edition, kurz Java EE [ˈdʒɑːvə ˌiːˈiː]. Dies ersetzt die vorherige Abkürzung J2EE [ˌdʒeɪˈtuː ˌiːˈiː] (Java 2 Platform, Enterprise Edition).
| Version | Ausführlicher Name | Veröffentlichungsdatum der Final Release |
| 1.0 | Java 2 Platform Enterprise Edition, v 1.0 | Dezember 1999 |
| 1.2 | Java 2 Platform Enterprise Edition, v 1.2 | 2000 |
| 1.2.1 | Java 2 Platform Enterprise Edition, v 1.2.1 | 23. Mai 2000 |
| 1.3 | Java 2 Platform Enterprise Edition, v 1.3 | 24. September 2001 |
| 1.4 | Java 2 Platform Enterprise Edition, v 1.4 | 24. November 2003 |
| 5 | Java Platform, Enterprise Edition, v 5 | 11. Mai 2006 |
| 6 | Java Platform, Enterprise Edition, v 6 | 10. Dezember 2009 |
| 7 | Java Platform, Enterprise Edition, v 7 | 12. Mai 2013 |
| 8 | Java Platform, Enterprise Edition, v 8 | 18. September 2017 |
Danach folgten die Versionen:
* Jakarta EE 8 (2019), vollkompatible Version zu Java Platform, Enterprise Edition, v 8
* Jakarta EE 9 (2020)
* Jakarta EE 9.1 (2021)
* Jakarta EE 10 (2022)

## Infrastruktur

Jakarta-EE-Komponenten erfordern als Laufzeitumgebung eine spezielle Infrastruktur, einen sogenannten Jakarta EE Application Server. Dieser Server stellt technische Infrastruktur bereit wie
* Sicherheit (Security),
* Transaktionsmanagement,
* Namens- und Verzeichnisdienste,
* Kommunikation zwischen Jakarta-EE-Komponenten,
* Persistenzdienste zum langfristigen Speichern von Java-Objekten,
* Management der Komponenten über den gesamten Lebenszyklus (inklusive Instanziierung),
* Unterstützung für die Installation (Deployment).
Des Weiteren kapselt der Server den Zugriff auf die Ressourcen des zugrundeliegenden Betriebssystems (Dateisystem, Netzwerk, …).
Ein Jakarta-EE-Server wird in diverse logische Systeme unterteilt. Diese werden Container genannt. Die aktuelle Spezifikation erfordert die folgenden Container:
* einen EJB-Container als Laufzeitumgebung für Jakarta Enterprise Beans
* einen Web-Container als Laufzeitumgebung für Jakarta Servlets und Jakarta Server Pages (JSP)
* einen JCA-Container als Laufzeitumgebung für JCA Connectoren. Dieser ist zwar nicht explizit definiert, faktisch jedoch muss jeder Application-Server-Hersteller diesen implementieren. Denn im Jakarta Enterprise Beans (EJB) sowie im Web-Container sind Restriktionen definiert, welche für die JCA-Laufzeitumgebung nicht gelten. Dabei handelt es sich beispielsweise um das Starten von Threads oder das Lesen und Schreiben in Dateien etc.
* einen JMS-Provider als Verwaltungssystem für Nachrichtenwarteschlangen.
Es sind zahlreiche Implementierungen für Jakarta-EE-Server verfügbar, teils proprietär, teils in Form frei verfügbarer Open-Source-Lösungen (z. B. WildFly). Eine Referenzimplementierung wird von der Eclipse Foundation zur Verfügung gestellt. Zu beachten ist, dass nicht alle Server die Spezifikation von Jakarta EE vollständig abdecken. Jedoch veröffentlichen Oracle und Eclipse für jede Version eine Liste der derzeit zertifizierten Server.
Als weitere Infrastrukturkomponente kommt für die persistente Speicherung von Daten ein Datenbankmanagementsystem (DBMS) zum Einsatz. Hierbei kann es sich um ein relationales System handeln, oder aber auch um ein vergleichbares System wie beispielsweise ein OODBMS. Die Anbindung der Datenbankmanagementsysteme erfolgt meist über einen JDBC-Treiber.
Der clientseitige Zugriff auf eine Jakarta-EE-Anwendung erfolgt oft über einen Browser, daneben sind aber auch Applikations-Clients (Java-Applikationen, CORBA-Komponenten, Webservice-Clients) verbreitet.

## Wichtige APIs

Die Jakarta-EE-APIs beinhalten verschiedene Technologien, die die Funktionalität des Basis-Java-SE-APIs erweitern bzw. ersetzen. Neben den aktuellen Bezeichnungen werden in der Tabelle die alten Benennungen ergänzend genannt.
| Name und Abkürzung | Beschreibung | J2EE 1.4 | Java EE 5 | Java EE 6 | Java EE 7 | Java EE 8 |
| Jakarta Enterprise Beans (EJB), früher Enterprise JavaBeans | beinhalten die Geschäftslogik einer Enterprise-Anwendung oder gestatten Zugriff auf persistente Daten. Die Beans laufen in einem EJB-Container ab. Es gibt drei unterschiedliche Typen von EJBs: Session-Beans, sowohl zustandsbehaftet als auch zustandslos, implementieren die Geschäftslogik und sind meistens vom Client zugreifbar Message-Driven-Beans, kurz MDB, für die Verarbeitung von JMS-Nachrichten, wurden in Version 2.1 neu eingeführt Entity-Beans für die Abbildung von persistenten Datenobjekten (ab Version 3.0 obsolet, da EJBs durch Detachment auch außerhalb des Containers nutzbar sind) | ja (2.1) | ja (3.0) | ja (3.1) | ja (3.2) | ja (3.2) |
| Jakarta Servlet, früher Java Servlet | erlaubt im Allgemeinen die Erweiterung von Servern, deren Protokoll auf Anfragen und Antworten basiert. Primär werden Servlets im Zusammenhang mit dem Hypertext Transfer Protocol (HTTP) verwendet, wo sie in einem Web-Container leben und Anfragen von Webbrowsern beantworten. | ja (2.4) | ja (2.5) | ja (3.0) | ja (3.1) | ja (4.0) |
| Jakarta Server Pages (JSP), früher JavaServer Pages | sind Textdokumente, die zum einen aus statischem Text und zum anderen aus dynamischen Textelementen – den JSP-Elementen – bestehen. Die JSP-Seiten werden transparent vom Web-Container in ein Servlet umgewandelt. | ja (2.0) | ja (2.1) | ja (2.2) | ja (2.3) | ja (2.3) |
| Webservices (WS) | definieren Schnittstellen zu EJBs, die mit einem Uniform Resource Identifier (URI) eindeutig identifizierbar sind und deren Schnittstellen als XML-Artefakte definiert, beschrieben und gefunden werden können. | ja (1.0) | ja (1.2) | ja (1.3) | ja (1.4) | ja (1.4) |
| Java Naming and Directory Interface (JNDI) | ist eine gemeinsame Schnittstelle, mit der alle Java-Klassen auf Namens- und Verzeichnisdienste zugreifen können. Über JNDI wird insbesondere der Zugriff auf Java-EE-Komponenten sichergestellt. | ja (1.2) | ja (1.2) | ja (1.2 SE) | ja (1.2 SE) | ja (1.2 SE) |
| Jakarta Messaging (JMS), früher Java Message Service | ist eine API für die asynchrone Nachrichtenverarbeitung. | ja (1.1) | ja (1.1) | ja (1.1) | ja (2.0) | ja (2.0) |
| Jakarta Transactions API (JTA), früher Java Transaction API | erlaubt der Anwendung die Steuerung der Transaktionsverwaltung. JTA ist die Java-Schnittstelle zu Transaktionsmonitoren. Standardmäßig wird diese Schnittstelle implementiert vom Java Transaction Service (JTS), welcher eine Schnittstelle zum CORBA Object Transaction Service (OTS) bietet. | ja (1.0.1B) | ja (1.1) | ja (1.1) | ja (1.2) | ja (1.2) |
| Java Authentication and Authorization Service (JAAS) | ist eine Java-API, die es ermöglicht, Dienste zur Authentifikation und Zugriffsrechte in Java-Programmen bereitzustellen. JAAS implementiert ein standardmäßiges Pluggable Authentication Module (PAM) und unterstützt durch dieses Modul eine einfache Authentifizierung und benutzerbasierte Autorisierung. | ja (1.0) | ja (1.0) | ja (1.0) | ja (1.0) | ja (1.0) |
| Jakarta Mail, früher JavaMail | erlaubt den Zugriff auf Mail-Dienste wie z. B. SMTP, POP3 oder IMAP. | ja (1.2) | ja (1.4) | ja (1.4) | ja (1.5) | ja (1.6) |
| Jakarta XML Binding (JAXB), früher Java Architecture for XML Binding | ermöglicht es, ein XML-Schema direkt an Java-Klassen zu binden. Wurde offiziell erst seit Java EE Version 1.5 gefordert, wird jedoch evtl. schon vorher unterstützt. | nein | ja (2.0) | ja (2.2) | ja (2.2) | ja (2.2) |
| Java API for XML Processing (JAXP) | hilft dem Entwickler bei der Bearbeitung von XML-Dokumenten. | ja (1.2) | ja (1.3) | ja (1.4 (SE)) | ja (1.4 (SE)) | ja (1.4 (SE)) |
| Jakarta XML RPC (JAX-RPC), früher Java API for XML-based RPC | ermöglicht den entfernten Zugriff auf RPC-Dienste. | ja (1.0) | ja (1.1) | ja (1.1) | ja (1.1) | ja (1.1) |
| Jakarta RESTful Web Services (JAX-RS), früher Java API for RESTful Web Services | | nein | nein | ja (1.1) | ja (2.0) | ja (2.1) |
| Java API for XML Registries (JAXR) | dient dazu, einen transparenten Zugriff auf so genannte Business-Registries wie beispielsweise ebXML oder ein UDDI-basiertes Verzeichnis sicherzustellen. | ja (1.0) | ja (1.0) | ja (1.0) | ja (1.0) | ja (1.0) |
| Java Authorization Contract for Containers (JACC) | definiert diverse Sicherheitsrichtlinien für die diversen Java-EE-Container. | ja (1.0) | ja (1.1) | ja (1.4) | ja (1.5) | ja (1.5) |
| Jakarta Connectors (JCA), früher J2EE Connector Architecture | dient dazu, andere Systeme transparent zu integrieren (Stichwort: EAI). | ja (1.5) | ja (1.5) | ja (1.6) | ja (1.7) | ja (1.7) |
| JavaBeans Activation Framework (JAF) | bietet die Möglichkeit, verschiedene Daten anhand des MIME-Headers zu erkennen. | ja (1.0) | ja (1.1) | ja (1.1) | ja (1.1) | ja (1.1) |
| Jakarta XML Web Services (JAX-WS), früher Java API for XML Web Services | hilft bei der Erstellung von Webservices und zugehörigen Clients, die über XML kommunizieren, z. B. über SOAP. | nein | ja (2.0) | ja (2.2) | ja (2.2) | ja (2.2) |
| Web Service Metadata | beschreibt Web-Services mit Java-Annotationen | nein | ja (2.0) | ja (2.1) | ja (2.1) | ja (2.1) |
| Jakarta Persistence API (JPA), früher Java Persistence API | stellt eine einheitliche und datenbankunabhängige Schnittstelle für Object-Relational-Mapping und das Arbeiten mit Entitäten bereit. | nein | ja (1.0) | ja (2.0) | ja (2.1) | ja (2.2) |
| Streaming API for XML (StAX) | ist eine cursorbasierte XML-Verarbeitung in Ergänzung der DOM- und SAX-Parser | nein | ja (1.0) | ja (1.0) | ja (1.0) | ja (1.0) |
| Jakarta Server Faces (JSF), früher JavaServer Faces | dient dazu, Komponenten für Benutzerschnittstellen in Webseiten einzubinden und die Navigation zu definieren. | nein | ja (1.2) | ja (2.0) | ja (2.2) | ja (2.3) |
| Expression Language (EL) | | nein | nein | ja (2.2) | ja (3.0) | ja (3.0) |
| Jakarta Standard Tag Library (JSTL), früher JavaServer Pages Standard Tag Library | ist eine Sammlung von JSP-Tags für die Strukturierung, XML, SQL, Internationalisierung und so weiter | nein | ja (1.2) | ja (1.2) | ja (1.2) | ja (1.2) |
| Contexts and Dependency Injection (CDI) | ist eine Technik, um Felder nach dem Inversion-of-Control-Prinzip zu setzen. Es erlaubt dem Entwickler, verschiedene fachliche Kontexte miteinander zu verbinden. Es verbindet außerdem JSF mit EJB. | nein | nein | ja (1.0) | ja (1.1) | ja (2.0) |
| Java API for WebSocket (WebSocket) | Verwendet WebSockets, um aus serverseitig laufenden Java-Prozessen Nachrichten an JavaScript-Browser-Anwendungen zu senden. | nein | nein | nein | ja (1.0) | ja (1.1) |
| Java API for JSON Processing (JSON-P) | | nein | nein | nein | ja (1.0) | ja (1.1) |
| Batch Applications for the Java Platforms (Batch) | | nein | nein | nein | ja (1.0) | ja (1.0) |
| Bean Validation | | nein | nein | ja (1.0) | ja (1.1) | ja (2.0) |
| Managed Beans | | nein | nein | ja (1.0) | ja (1.0) | ja (1.0) |
| Concurrency Utilities for Java EE | | nein | nein | nein | ja (1.0) | ja (1.0) |
| Interceptors | | nein | nein | ja (1.1) | ja (1.2) | ja (1.2) |
| Common Annotations for the Java Platform | | nein | nein | ja (1.1) | ja (1.2) | ja (1.3) |
| Authentication Service Provider Interface for Containers (JASPIC) | | nein | nein | ja (1.0) | ja (1.1) | ja (1.1) |
| Enterprise Edition Management API | | nein | nein | ja (1.1) | ja (1.1) | ja (1.1) |
| Enterprise Edition Deployment API | | nein | nein | ja (1.2) | ja (1.2) | ja (1.2) |
| Java EE Security API | | nein | nein | nein | nein | ja (1.0) |

## Implementierungen

Eine Implementierung des Jakarta-EE-Standards kann zusätzlich von Oracle für die jeweilige Version zertifiziert werden. Dadurch wird die grundsätzliche Kompatibilität der Anwendungen zwischen den Servern bestätigt. Jedoch zeigt sich in der Praxis oft, dass eine Portierung einer Applikation von einem Jakarta-EE-Server zum anderen mit Problemen verbunden ist. So werden teilweise unbewusst Hersteller-abhängige Bibliotheken genutzt.

### Komplette Jakarta-EE-Server

Der derzeitige Stand der Zertifizierung (nach dem Oracle TCK) steht in Klammern dahinter.

#### Open Source Server

* Apache Geronimo (benutzt wahlweise Apache Tomcat oder Jetty) (Java EE 6 Full Profile und Web Profile)
* WildFly (früher JBoss) (Apache Tomcat oder Undertow) (Java EE 8 Full Profile und Web Profile, Jakarta EE 8 Full Profile)
* JOnAS (benutzt Apache Tomcat oder Jetty) (Java EE 6 Web Profile)
* GlassFish (Java EE 8 Full Profile und Web Profile, Jakarta EE 8 Full Profile und Web Profile)
* Payara Server (Jakarta EE 8 Full Profile)
* Open Liberty (Jakarta EE 8 Full Profile und Web Profile)

#### Kommerzielle Server

* ATG Dynamo Application Server (DAS) (Java EE 1.3)
* Oracle WebLogic seit der Übernahme von BEA durch Oracle 2008 (Java EE 7 Full Profile)
* Oracle Application Server (Java EE 5)
* Orion Application Server
* SAP NetWeaver Application Server (Java EE 5)
* SAP Cloud Platform (Java EE 7 Web Profile)
* IBM WebSphere Application Server (WAS) (Java EE 8 Full Profile und Web Profile)
* JBoss EAP (Java EE 8 Full Profile und Web Profile)

#### Verbreitung der Jakarta-EE-Server

Im Jahr 2007 wurden die folgenden Nutzerzahlen bekannter Java-EE-Server veröffentlicht. Unter Nutzer findet sich die Anzahl der Unternehmen und Organisationen, die den jeweiligen Server lizenziert oder, im Falle von JBoss, einen Wartungsvertrag abgeschlossen haben. JBoss schätzt, dass es insgesamt 10.000 Nutzer der JBoss Enterprise Application Platform gibt.
| Jakarta-EE-Server | Anzahl Nutzer |
| IBM WebSphere Application Server | 75.000 |
| Oracle Application Server | 32.000 |
| BEA WebLogic | 15.000 |
| SAP NetWeaver Application Server | 12.000 |
| SUN Sun Java System Application Server (GlassFish) | 3.000 |
| JBoss Application Server (WildFly) | 1.000 |

### Separate Web-Container (Servlet-/JSP-Container)

* Apache Tomcat
* Jetty
* Resin

### Separate EJB-Container

* Apache OpenEJB – Open Source

## Weitere Java-Plattformen

* Java Platform, Standard Edition
* Java Platform, Micro Edition