{"id":66,"date":"2019-12-12T15:23:00","date_gmt":"2019-12-12T14:23:00","guid":{"rendered":"http:\/\/baptiste-meynier.com\/?p=66"},"modified":"2023-02-18T18:42:49","modified_gmt":"2023-02-18T17:42:49","slug":"javaee-fait-peau-neuve-bienvenue-a-jakarta-ee","status":"publish","type":"post","link":"https:\/\/baptiste-meynier.com\/index.php\/2019\/12\/12\/javaee-fait-peau-neuve-bienvenue-a-jakarta-ee\/","title":{"rendered":"JavaEE fait peau neuve, bienvenue \u00e0 Jakarta EE"},"content":{"rendered":"\n<p>Le 10 septembre 2019, la fondation Eclipse publia sous licence opensource Jakarta EE 8.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pourquoi ce nom Jakarta EE ?<\/h2>\n\n\n\n<p>Baaa,&nbsp;<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Jakarta\">Jakarta<\/a>&nbsp;c\u2019est la capitale de l\u2019Indon\u00e9sie. Elle est situ\u00e9e \u00e0 l\u2019extr\u00e9mit\u00e9 nord-ouest de l\u2019\u00eele de \u2026<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"488\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/java_islande-1024x488-1.png\" alt=\"\" class=\"wp-image-67\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/java_islande-1024x488-1.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/java_islande-1024x488-1-300x143.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/java_islande-1024x488-1-768x366.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Je vous le donne en mille,&nbsp;<strong>Java<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Avant de rentrer dans les d\u00e9tails, revenons quelques temps en arri\u00e8re<\/h3>\n\n\n\n<p>En 1999, la soci\u00e9t\u00e9 Oracle d\u00e9cide de cr\u00e9er une extension \u00e0 la plateforme standard (Java Standard \u00c9dition). Cette extension est destin\u00e9e aux entreprises pour faciliter le d\u00e9veloppement notamment d\u2019applications Web. Cette extension est appel\u00e9e J2EE (Java 2 Entreprise \u00c9dition).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1023\" height=\"401\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/timeline_background.png\" alt=\"\" class=\"wp-image-123\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/timeline_background.png 1023w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/timeline_background-300x118.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/timeline_background-768x301.png 768w\" sizes=\"auto, (max-width: 1023px) 100vw, 1023px\" \/><\/figure>\n<\/div>\n\n\n<p>Huit versions ont \u00e9t\u00e9 publi\u00e9es en 18 ans. Le cycle de releases n\u2019a pas \u00e9t\u00e9 r\u00e9guli\u00e9 et est devenu de plus en plus long.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mais c\u2019est quoi exactement le JavaEE ?<\/h3>\n\n\n\n<p>Une version JavaEE est compos\u00e9e d\u2019un ensemble de JSR.<\/p>\n\n\n\n<p>JSR est l\u2019acronyme de Java Sp\u00e9cification Request, elle peut d\u00e9signer la plateforme SE (Standard Edition) ou EE (Entreprise Edition).<br>Une JSR est compos\u00e9e d\u2019une :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sp\u00e9cification<\/li>\n\n\n\n<li>Impl\u00e9mentation par d\u00e9faut<\/li>\n\n\n\n<li>Suite de tests appel\u00e9e TCK (Technology Compatibility Kit) permettant de valider une impl\u00e9mentation.<\/li>\n<\/ul>\n\n\n\n<p>L\u2019ensemble des JSR sont r\u00e9pertori\u00e9es sur le site de la&nbsp;<a href=\"https:\/\/jcp.org\/en\/home\/index\">Java Community Process<\/a>&nbsp;(JCP).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jsrList-1.png\" alt=\"\" class=\"wp-image-78\" width=\"603\" height=\"330\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jsrList-1.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jsrList-1-300x164.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jsrList-1-768x421.png 768w\" sizes=\"auto, (max-width: 603px) 100vw, 603px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Pour d\u00e9mystifier la chose, prenons la&nbsp;<a href=\"https:\/\/jcp.org\/aboutJava\/communityprocess\/final\/jsr365\/index.html\">JSR-365<\/a>&nbsp;standardisant l\u2019injection de d\u00e9pendance.<br>Cette JSR appel\u00e9e CDI poss\u00e8de pour sa version 2.0-final :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une&nbsp;<a href=\"https:\/\/download.oracle.com\/otndocs\/jcp\/cdi-2-final-spec\/\">sp\u00e9cification<\/a><\/li>\n\n\n\n<li>Son impl\u00e9mentation par d\u00e9faut&nbsp;<a href=\"https:\/\/weld.cdi-spec.org\/\">Weld<\/a><\/li>\n\n\n\n<li>Son&nbsp;<a href=\"https:\/\/download.jboss.org\/cdi\/tck\/2.0.0.Final\/\">kit de validations<\/a><\/li>\n<\/ul>\n\n\n\n<p>Il existe d\u2019autres impl\u00e9mentations comme par exemple&nbsp;<a href=\"http:\/\/openwebbeans.apache.org\/\">OpenWebBeans<\/a>, qui pour \u00eatre certifi\u00e9 a d\u00fb passer par la case TCK.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">En pratique<\/h4>\n\n\n\n<p>Cr\u00e9ez un projet java standard via maven et importez l\u2019api de CDI dans l\u2019un de vos projets :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupid&gt;javax.enterprise&lt;\/groupid&gt;\n    &lt;artifactid&gt;cdi-api&lt;\/artifactid&gt;\n    &lt;version&gt;2.0&lt;\/version&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p>Jetons un oeil sur ce que contient l\u2019api:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/cdi-api.png\" alt=\"\" class=\"wp-image-75\" width=\"383\" height=\"451\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/cdi-api.png 572w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/cdi-api-255x300.png 255w\" sizes=\"auto, (max-width: 383px) 100vw, 383px\" \/><\/figure>\n<\/div>\n\n\n<p>Vous remarquerez qu\u2019elle est uniquement compos\u00e9e d\u2019Interfaces, Annotations et Exceptions. Tous ces objets sont mentionn\u00e9s et d\u00e9cris dans les sp\u00e9cifications de la JSR.<\/p>\n\n\n\n<p>Pour que votre projet puisse utiliser le syst\u00e8me d\u2019injection de d\u00e9pendance, il faut lui fournir une impl\u00e9mentation:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">&lt;dependency&gt;\n  &lt;groupid&gt;org.jboss.weld.se&lt;\/groupid&gt;\n  &lt;artifactid&gt;weld-se-core&lt;\/artifactid&gt;\n  &lt;version&gt;3.0.0.Final&lt;\/version&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p>Ce syst\u00e8me de sp\u00e9cification \/ impl\u00e9mentation se base sur un m\u00e9canisme cr\u00e9\u00e9 pour la version 6 de java, les Services Provider Interface (ce sujet fera l\u2019objet d\u2019un article \u00e0 part enti\u00e8re).<\/p>\n\n\n\n<p>Nous l\u2019avons vu plus haut, JavaEE ce n\u2019est pas seulement une api d\u2019injection.<br>Voici la cartographie des JSRs pr\u00e9sentes dans la spec&nbsp;<a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=366\">JavaEE 8<\/a>:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/jee8.png\" alt=\"\" class=\"wp-image-125\" width=\"790\" height=\"536\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/jee8.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/jee8-300x204.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/jee8-768x521.png 768w\" sizes=\"auto, (max-width: 790px) 100vw, 790px\" \/><\/figure>\n<\/div>\n\n\n<p>\u00c7a en fait un tas de services pr\u00eats \u00e0 utiliser !<\/p>\n\n\n\n<p>Lorsque vous t\u00e9l\u00e9chargez un Serveur JavaEE, vous r\u00e9cup\u00e9rez la totalit\u00e9 des 33 JSR. Prenons l\u2019exemple de la&nbsp;<a href=\"https:\/\/wildfly.org\/news\/2018\/02\/28\/WildFly12-Final-Released\/\">premi\u00e8re version de Wildfly impl\u00e9mentant JavaEE 8<\/a>, elle p\u00e8se 162 Mo. Ca fait beaucoup !<\/p>\n\n\n\n<p>JavaEE \u00e0 partir de sa version 6 introduit la notion de profile. La version Full contiendra l\u2019int\u00e9gralit\u00e9 des JSR tandis que le profile Web sera uniquement compos\u00e9 des JSR blanches (14 JSR de moins, de quoi all\u00e9ger le poids du serveur).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Quelques serveurs JavaEE<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1008\" height=\"606\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/javaeeServers.png\" alt=\"\" class=\"wp-image-127\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/javaeeServers.png 1008w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/javaeeServers-300x180.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/javaeeServers-768x462.png 768w\" sizes=\"auto, (max-width: 1008px) 100vw, 1008px\" \/><\/figure>\n<\/div>\n\n\n<p>Vous les connaissez tous. Derri\u00e8re ces serveurs se cachent les plus gros acteurs de la sc\u00e8ne informatique, respectivement IBM, Red-Hat, Oracle.<\/p>\n\n\n\n<p>Chaque serveur est libre de fournir l\u2019impl\u00e9mentation de son choix des JSR JavaEE.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Prenons l\u2019exemple de la JSR JPA:<\/h5>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<figure class=\"wp-block-table is-style-regular\"><table><tbody><tr><td><strong>Serveurs<\/strong><\/td><td>Glassfish<\/td><td>WebSphere<\/td><td>JBoss<\/td><td>Wildfy<\/td><td>WebLogic<\/td><td>SAP Cloud Platform<\/td><td><\/td><\/tr><tr><td><strong>Impl\u00e9mentations<\/strong><\/td><td>EclipseLink<\/td><td>EclipseLink<\/td><td>Hibernate<\/td><td>Hibernate<\/td><td>EclipseLink<\/td><td>EclipseLink<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Quels \u00e9taient les objectifs du JavaEE ?<\/h3>\n\n\n\n<figure class=\"wp-block-pullquote\"><blockquote><p><strong>Proposer des API standards utilisables par tous les serveurs JavaEE.<\/strong><\/p><\/blockquote><\/figure>\n\n\n\n<p>L\u2019id\u00e9e est qu\u2019un code java fonctionnant sur un serveur, par exemple Glassfish, pourra s\u2019ex\u00e9cuter sans modification sur un serveur Wildfly.<\/p>\n\n\n\n<p>La grande force du JavaEE c\u2019est que tout le monde le connait. Nous travaillons avec depuis des ann\u00e9es et cela m\u00eame peut-\u00eatre sans le savoir. Un d\u00e9veloppeur travaillant sur une application Spring Boot aura sans doute eu l\u2019occasion d\u2019utiliser l\u2019api JPA avec Hibernate.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">D\u00e9samour pour les serveurs JavaEE<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dans un monde en constante \u00e9volution, utiliser une technologie dont le cycle de release peut atteindre 4 ans n\u2019est plus concevable.<\/li>\n\n\n\n<li>La taille des serveurs full ne se pr\u00eatent pas \u00e0 une architecture cloud, imaginez une image Docker contenant un jdk&nbsp; d\u2019environ 200 mo + un serveur de 150 mo. L\u2019addition finit par \u00eatre sacr\u00e9ment sal\u00e9e !<\/li>\n\n\n\n<li>Son autre d\u00e9faut est sa difficult\u00e9 \u00e0 effectuer des tests. Arquillian permet d\u2019effectuer des tests mais il reste difficile \u00e0 prendre en main, \u00e0 maintenir et s\u2019av\u00e8re parfois lent. Nous verrons par la suite qu\u2019il existe d\u2019autre moyen de tester son application JavaEE.<\/li>\n<\/ul>\n\n\n\n<p>En avril 2014, Spring boot d\u00e9barque et donne un bon coup de pied dans la fourmili\u00e8re. Ses fonctionnalit\u00e9s d\u2019import via un bom le rendent plus flexible, l\u00e9ger, rapide. Il est aussi plus facile \u00e0 tester. Pour finir, son cycle de release est plus court que celui de JavaEE.<\/p>\n\n\n\n<p>Fin d\u2019ann\u00e9e 2017, coup de tonnerre dans le monde du d\u00e9veloppement Java, la soci\u00e9t\u00e9 Oracle d\u00e9tentrice des droits d\u2019exploitations de la licence JavaEE d\u00e9cide d\u2019arr\u00eater sa maintenance !<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Et Jakarta EE dans tout \u00e7a ?<\/h2>\n\n\n\n<p>Jakarta EE est la version open-source de JavaEE. D\u00e8s novembre 2017 la&nbsp;<a href=\"https:\/\/www.eclipse.org\/org\/\">Fondation Eclipse<\/a>&nbsp;cr\u00e9\u00e9 le projet Eclipse Enterprise for Java (EE4J). Il lui faudra 2 ans pour d\u00e9finir une structure capable de faire \u00e9voluer le projet.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/eclipse-foundation.png\" alt=\"\" class=\"wp-image-88\" width=\"328\" height=\"106\"\/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>L\u2019equivalent du JCP s\u2019appelle dor\u00e9navant&nbsp;<a href=\"https:\/\/www.eclipse.org\/projects\/dev_process\/\">Eclipse Foundation Specification Process<\/a>&nbsp;(EFSP). Les TCK existent toujours, en revanche les impl\u00e9mentations de r\u00e9f\u00e9rences n\u2019existent plus.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote\"><blockquote><p>Une release sera publi\u00e9e tous les ans !<\/p><\/blockquote><\/figure>\n\n\n\n<p>Vous trouverez le d\u00e9tail du nouveau processus de d\u00e9veloppement dans ce&nbsp;<a href=\"https:\/\/www.eclipse.org\/projects\/dev_process\/\">lien<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Y a-t-il de nouveau dans Jakarta EE 8 ?<\/h3>\n\n\n\n<p>A vrai dire pas grand chose. L\u2019essentiel des efforts a \u00e9t\u00e9 men\u00e9 sur la cr\u00e9ation d\u2019une nouvelle structure, cependant quelques JSR ont \u00e9t\u00e9 mont\u00e9es de version :<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-background\" style=\"background-color:#f3f4f5\"><thead><tr><th>JSR<\/th><th>JavaEE8<\/th><th>=&gt;<\/th><th>JakartaEE8<\/th><\/tr><\/thead><tbody><tr><td>Transaction<\/td><td>1.2<\/td><td><\/td><td>1.3<\/td><\/tr><tr><td>Deployment<\/td><td>1.2<\/td><td><\/td><td>1.7<\/td><\/tr><tr><td>Concurrency<\/td><td>1.0<\/td><td><\/td><td>1.1<\/td><\/tr><tr><td>Activation<\/td><td>1.1<\/td><td><\/td><td>1.2<\/td><\/tr><tr><td>SOAP with Attachments<\/td><td>1.3<\/td><td><\/td><td>1.4<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Y-a t-il des serveurs certifi\u00e9s Jakarta EE 8 ?<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jakartaEECertified-1-1024x804-1.png\" alt=\"\" class=\"wp-image-90\" width=\"756\" height=\"594\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jakartaEECertified-1-1024x804-1.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jakartaEECertified-1-1024x804-1-300x236.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jakartaEECertified-1-1024x804-1-768x603.png 768w\" sizes=\"auto, (max-width: 756px) 100vw, 756px\" \/><\/figure>\n<\/div>\n\n\n<p>H\u00e9 oui, et pas qu\u2019un seul !&nbsp;Eclipse GlassFish, Payara, Wildfly, Open Liberty.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Comment migrer une application JavaEE 8 vers Jakarta EE 8 ?<\/h3>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"298\" style=\"aspect-ratio: 498 \/ 298;\" width=\"498\" controls src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/jakartaeeMigration.mp4\"><\/video><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\"><\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Prenons quelques composants et faisons r\u00e9f\u00e9rences \u00e0 ses JSR respectives:<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">JPA \/ Beans Validation<\/h4>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"882\" height=\"360\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/uml_jakarta.png\" alt=\"\" class=\"wp-image-108\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/uml_jakarta.png 882w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/uml_jakarta-300x122.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/uml_jakarta-768x313.png 768w\" sizes=\"auto, (max-width: 882px) 100vw, 882px\" \/><\/figure>\n<\/div>\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java line-numbers\">@Entity\n@NamedQueries({\n        @NamedQuery(name = \"Fish.getAll\", query = \"select f from Fish f\"),\n        @NamedQuery(name = \"Fish.findByName\", query = \"select f from Fish f where f.name = :fishName\"),\n        @NamedQuery(name = \"Fish.countByFamily\", query = \"select count(fi) from Fish fi where fi.family.name = :familyName\")\n}\n)\npublic class Fish implements Serializable {\n\n    @Id\n    @GeneratedValue(strategy=GenerationType.SEQUENCE)\n    private long id;\n    @NotBlank\n    private String name;\n    @Positive\n    private int temperature;\n    @Positive\n    @DecimalMin(\"0.3\")\n    private float price;\n    @NotNull\n    @ManyToOne(fetch = FetchType.LAZY)\n    @JoinColumn(name=\"family_fk\")\n    private Family family;\n    @OneToMany(mappedBy = \"fish\")\n    private Collection&lt;Stock&gt; stock;<\/code><\/pre>\n\n\n\n<p>L\u2019api de persistance est connue par tous. Qui n\u2019a jamais utilis\u00e9 les annotations @Entity, @Id, @ManyToOne ? D\u2019autres annotations sont venues se glisser dans ce code. Elles proviennent de l\u2019api beans validation. Ces annotations sont utilisables sur n\u2019importe quel objet pas seulement sur les entitys.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CDI<\/h3>\n\n\n\n<p>Pour activer l\u2019api d\u2019injection de d\u00e9pendances, un fichier nomm\u00e9 beans.xml doit \u00eatre plac\u00e9 dans le r\u00e9pertoire META-INF ou WEB-INF respectivement pour les Jars ou War\/Ear. Sans configuration, ce fichier peut rester vide. Ici nous y d\u00e9clarons un d\u00e9corator.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;beans\n        xmlns=\"http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\"\n        xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n        xsi:schemaLocation=\"http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\n                      http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\/beans_1_1.xsd\"\n        bean-discovery-mode=\"all\"&gt;\n    &lt;decorators&gt;\n        &lt;class&gt;com.bmeynier.article.jakarta.decorator.FishServiceDecorator&lt;\/class&gt;\n    &lt;\/decorators&gt;\n&lt;\/beans&gt;<\/code><\/pre>\n\n\n\n<p>Pour injecter une impl\u00e9mentation un simple @Inject fera l\u2019affaire ! CDI ne se r\u00e9sume bien \u00e9videment pas \u00e0 cela, cette API est d\u2019une grande richesse.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Inject\nprivate FishService fishService;<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">JAX-RS<\/h3>\n\n\n\n<p>Avec CDI certainement l\u2019une des p\u00e9pites de Jakarta EE, JAX-RS vous permet d\u2019exposer vos services REST. Tout comme CDI, cette api doit \u00eatre activ\u00e9e en d\u00e9clarant une classe h\u00e9ritant de la classe Application. C\u2019est \u00e0 cet endroit que vous pourrez configurer votre api REST.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@ApplicationPath(\"\/petshop\")\npublic class PetShopApplication extends Application {}<\/code><\/pre>\n\n\n\n<p>Ci-dessous un exemple de ressource jax-rs :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java line-numbers\">@Valid\n@Path(\"fish\")\n@ApplicationScoped\n@Produces(MediaType.APPLICATION_JSON)\n@Consumes(MediaType.APPLICATION_FORM_URLENCODED)\npublic class FishResource {\n\n    private static final Logger LOGGER = Logger.getLogger(FishResource.class.getName());\n\n    @Inject\n    private FishService fishService;\n\n    @Resource(name=\"concurrent\/__defaultManagedExecutorService\")\n    private Executor executor;\n\n    @GET\n    @Path(\"{fishFamily}\")\n    public int countByFamily(@NotBlank @PathParam(\"fishFamily\") String fishFamily) {\n        return fishService.countByFamily(fishFamily);\n    }\n\n    @POST\n    @Path(\"{fishName}\")\n    public Response buy(@BeanParam FishTransactionParam fishTransactionParam) {\n        float bill = fishService.buy(fishTransactionParam.shopName, fishTransactionParam.fishName, fishTransactionParam.quantity);\n        return Response.ok(bill).build();\n    }<\/code><\/pre>\n\n\n\n<p><strong>Dans ce projet se trouve des exemples :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>d\u2019interrogation de base de donn\u00e9es via diverses techniques : query native, naming query, criteria ou simplement via l\u2019entity manager (JPA)<\/li>\n\n\n\n<li>de producer, c\u2019est \u00e0 dire d\u2019objets instanci\u00e9s programmatiquement et inject\u00e9s via l\u2019annotation @Inject (CDI)<\/li>\n\n\n\n<li>de traitement asynchrone via le d\u00e9clenchement d\u2019events et la d\u00e9claration d\u2019un observer (CDI)<\/li>\n\n\n\n<li>de d\u00e9l\u00e9gators, technique permettant d\u2019ajouter un comportement \u00e0 l\u2019appel d\u2019une m\u00e9thode (CDI)<\/li>\n\n\n\n<li>de mapping d\u2019exceptions via les ExceptionsMapper (JAX-RS)<\/li>\n\n\n\n<li>d\u2019abonnement \u00e0 des flux http unidirectionnel serveur vers client, le Server Sent Event (JAX-RS)<\/li>\n\n\n\n<li>etc<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Et si on parlait test ?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">L\u2019instanciation programmatique<\/h3>\n\n\n\n<p>Il est tout \u00e0 fait possible d\u2019instancier soit m\u00eame un conteneur Jakarta EE, prenons l\u2019exemple de l\u2019entity manager :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java line-numbers\"> private static EntityManagerFactory entityManagerFactory;\n private static EntityManager entityManager;\n private static ShopRepository shopRepository;\n\n @BeforeAll\n public static void setUpBeforeClass() {\n     Properties properties = new Properties();\n     properties.put(\"eclipselink.persistencexml\",\"META-INF\/persistence-h2.xml\");\n     entityManagerFactory = Persistence.createEntityManagerFactory(\"JPADemo\", properties);\n     entityManager = entityManagerFactory.createEntityManager();\n     shopRepository = new ShopRepository(entityManager);\n }\n\n @AfterAll\n public static void tearDownAfterClass() {\n     entityManager.close();\n     entityManagerFactory.close();\n }<\/code><\/pre>\n\n\n\n<p>Dans lequel nous faisons r\u00e9f\u00e9rence \u00e0 un persistence.xml configur\u00e9 via une base h2.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml line-numbers\">&lt;persistence xmlns=\"http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\"\n             xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n             xsi:schemaLocation=\"http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\n             http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\/persistence_2_1.xsd\"\n             version=\"2.1\"&gt;\n\n    &lt;persistence-unit name=\"JPADemo\" transaction-type=\"RESOURCE_LOCAL\"&gt;\n        &lt;provider&gt;org.eclipse.persistence.jpa.PersistenceProvider&lt;\/provider&gt;\n        &lt;class&gt;com.bmeynier.article.jakarta.model.Fish&lt;\/class&gt;\n        &lt;class&gt;com.bmeynier.article.jakarta.model.Family&lt;\/class&gt;\n        &lt;class&gt;com.bmeynier.article.jakarta.model.FishStockKey&lt;\/class&gt;\n        &lt;class&gt;com.bmeynier.article.jakarta.model.Shop&lt;\/class&gt;\n        &lt;class&gt;com.bmeynier.article.jakarta.model.Stock&lt;\/class&gt;\n        &lt;properties&gt;\n            &lt;!-- Configuring The Database Connection Details --&gt;\n            &lt;property name=\"javax.persistence.jdbc.driver\" value=\"org.h2.Driver\" \/&gt;\n            &lt;property name=\"javax.persistence.jdbc.url\" value=\"jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE\" \/&gt;\n            &lt;property name=\"javax.persistence.jdbc.user\" value=\"sa\" \/&gt;\n            &lt;property name=\"javax.persistence.jdbc.password\" value=\"\" \/&gt;\n            &lt;property name=\"javax.persistence.sql-load-script-source\" value=\"META-INF\/data.sql\"\/&gt;\n            &lt;property name=\"javax.persistence.schema-generation.database.action\" value=\"drop-and-create\"\/&gt;\n        &lt;\/properties&gt;\n\n    &lt;\/persistence-unit&gt;\n&lt;\/persistence&gt;<\/code><\/pre>\n\n\n\n<p>Dans mon cas je fais r\u00e9f\u00e9rence \u00e0 un fichier persistence.xml pr\u00e9sent dans mes resources de tests, j\u2019aurais tr\u00e8s bien pu le configurer programmatiquement via un objet properties.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Test\nvoid it_should_count_fish_by_family() {\n    \/\/GIVEN\n    String familyName = \"Cichlidae\";\n    \/\/WHEN\n    int total = shopRepository.countFishByFamily(familyName);\n    \/\/THEN\n    assertThat(total, is(4));\n}<\/code><\/pre>\n\n\n\n<p>Le lancement d\u2019un conteneur jpa se fait en moins d\u2019une seconde.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">L&#8217;utilisation de l&#8217;extension JUnit 5 Weld<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;org.jboss.weld&lt;\/groupId&gt;\n    &lt;artifactId&gt;weld-junit5&lt;\/artifactId&gt;\n    &lt;version&gt;2.0.1.Final&lt;\/version&gt;\n    &lt;scope&gt;test&lt;\/scope&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p>Cette extension lance un conteneur CDI sans aucune configuration de votre part.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@EnableWeld\npublic class WeldInjectionTest {\n\n    @Inject\n    private ShopRepository shopRepository;\n\n    @WeldSetup\n    public WeldInitiator weld = WeldInitiator.from(ShopRepository.class, WeldInjectionTest.class).build();\n\n    @ApplicationScoped\n    @Produces\n    EntityManager produceEntityManager() {\n        return TestUtils.getEntityManagerFactory().createEntityManager();\n    }\n\n    @Test\n    void it_should_inject_repository(){\n        \/\/GIVEN\n        Family family = new Family();\n        family.setName(\"Scombridae\");\n        family.setWaterType(WaterType.SEA);\n        \/\/WHEN\n        shopRepository.saveFamily(family);\n        \/\/THEN\n    }\n}<\/code><\/pre>\n\n\n\n<p>Rapide et simple, cette extension vous permettra d\u2019utiliser n\u2019importe quelle fonctionnalit\u00e9 de CDI @Inject @Named @Decorator @Produce etc etc.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Smoke Tests<\/h3>\n\n\n\n<p id=\"Summary\">Il s\u2019agit de tests fonctionnels ou unitaires de fonctions logicielles critiques.<\/p>\n\n\n\n<p>Un test de fum\u00e9e r\u00e9pond aux questions suivantes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00ab&nbsp;Est-ce que le programme d\u00e9marre correctement ?&nbsp;\u00bb<\/li>\n\n\n\n<li>\u00ab&nbsp;Est-ce que les fonctionnalit\u00e9s principales fonctionnent ?&nbsp;\u00bb<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/microshed-300x53-1.png\" alt=\"\" class=\"wp-image-95\" width=\"317\" height=\"56\"\/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>MicroShed est une surcouche au framework TestContainer. Il cr\u00e9\u00e9 et lance pour vous une image Docker de votre application et permet d\u2019interroger de mani\u00e8re programmatique vos endpoints Rest.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@MicroShedTest\npublic class FishResourceIT {\n\n    private final static String CONTEXT_APPLICATION = \"jakarta-article\";\n\n    @Container\n    public static ApplicationContainer app = new ApplicationContainer(\"jakarta-article:latest\")\n            .withAppContextRoot(CONTEXT_APPLICATION);\n\n    @RESTClient\n    public static FishResource fishResource;\n\n    @Test\n    public void buyExistingFish() {\n        \/\/Given\n        String existingShop = \"Magic Fish\";\n        String existingFish = \"Scalaire\";\n        FishTransactionParam fishTransactionParam = new FishTransactionParam();\n        fishTransactionParam.fishName = existingFish;\n        fishTransactionParam.quantity = 1;\n        fishTransactionParam.shopName = existingShop;\n\n        \/\/When\n        Response response = fishResource.buy(fishTransactionParam);\n\n        \/\/Then\n        assertThat(response.getStatus(),is(Response.Status.OK.getStatusCode()));\n    }<\/code><\/pre>\n\n\n\n<p>Le lancement du test n\u00e9c\u00e9ssite un environnement disposant d\u2019une instance de docker.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/gitlab.com\/bmeynier\/jakartaee-8\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/gitlab.png\" alt=\"\" class=\"wp-image-93\" width=\"99\" height=\"91\"\/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"has-text-align-center\"><em>Retrouvez l\u2019int\u00e9gralit\u00e9 du code sur GitLab<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Impossible de parler de JakartaEE sans \u00e9voquer Eclipse MicroProfile <\/h3>\n\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"574\" height=\"101\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/microprofile.png\" alt=\"\" class=\"wp-image-100\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/microprofile.png 574w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/microprofile-300x53.png 300w\" sizes=\"auto, (max-width: 574px) 100vw, 574px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Les MicroProfiles sont \u00e9galement des sp\u00e9cifications d\u00e9tenus par la fondation Eclipse. Ils s\u2019inscrivent dans la continuit\u00e9 des profiles introduits dans JavaEE 6 (Serveur Full, Serveur Web). Il s\u2019agit d\u2019un sous-ensemble de JSR JakartaEE auquels de nouvelles sp\u00e9cifications ont \u00e9t\u00e9 ajout\u00e9es. L\u2019id\u00e9e est d\u2019\u00eatre capable de&nbsp;<a href=\"https:\/\/start.microprofile.io\/\">construire un serveur \u00e0 la carte<\/a>, compos\u00e9 uniquement de ce dont on a besoin. Pratique pour all\u00e9ger son image Docker !<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jakartaAndMicro.png\" alt=\"\" class=\"wp-image-98\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jakartaAndMicro.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jakartaAndMicro-300x178.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/10\/jakartaAndMicro-768x456.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>De plus il contient des sp\u00e9cifications permettant une meilleur int\u00e9gration au cloud, tel que le Health Check, la gestion des Configs ou encore les Metrics.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-text-align-center\">(Les MicroProfiles Eclipse feront l\u2019objet d\u2019un article plus d\u00e9taill\u00e9).<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Qu\u2019est-il pr\u00e9vu pour Jakarta EE 9 ?<\/h3>\n\n\n\n<p>Cette version est d\u00e9crite comme la \u00ab&nbsp;Tooling release&nbsp;\u00bb, cette release est pr\u00e9vue premi\u00e8re moiti\u00e9 2020.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>1) Le Big-Bang:<\/strong><\/h5>\n\n\n\n<p class=\"has-text-align-center\"><strong>Le namespace javax sera transform\u00e9 en jakarta.<\/strong><\/p>\n\n\n\n<p><em>Rassurez-vous, des utilitaires seront fournis pour aider \u00e0 la migration, notamment un plugin maven.<\/em><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">2) Alignement des impl\u00e9mentations sur Java 11 (derniere LTS)<\/h5>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>3) De nombreuses mises \u00e0 jour:<\/strong><\/h5>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-white-background-color has-background\"><thead><tr><th>JSR<\/th><th><strong>JakartaEE8<\/strong><\/th><th><strong>=&gt;<\/strong><\/th><th><strong>JakartaEE9<\/strong><\/th><\/tr><\/thead><tbody><tr><td>JSF<\/td><td>2.3<\/td><td><\/td><td>3.0<\/td><\/tr><tr><td>Security<\/td><td>1.0<\/td><td><\/td><td>1.1<\/td><\/tr><tr><td>JASPIC<\/td><td>1.1<\/td><td><\/td><td>1.2<\/td><\/tr><tr><td>JACC<\/td><td>1.5<\/td><td><\/td><td>1.7<\/td><\/tr><tr><td>JAX-RS<\/td><td>2.1<\/td><td><\/td><td>2.2<\/td><\/tr><tr><td>JEE Concurrency<\/td><td>1.1<\/td><td><\/td><td>1.2<\/td><\/tr><tr><td>Interceptor<\/td><td>1.2<\/td><td><\/td><td>1.3<\/td><\/tr><tr><td>Expression Language<\/td><td>3.0<\/td><td><\/td><td>3.1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">4) Suppression de JSR<\/h5>\n\n\n\n<p>Plusieurs JSR sont en ligne de mire, leur suppression fera l\u2019objet d\u2019un vote.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jakarta XM Registry<\/li>\n\n\n\n<li>Jakarta XML RPC<\/li>\n\n\n\n<li>Jakarta Deployment<\/li>\n\n\n\n<li>Jakarta Managment<\/li>\n\n\n\n<li>Jakarta Entreprise Bean entity beans<\/li>\n\n\n\n<li>Jakarta Entreprise Bean entity interoperability<\/li>\n\n\n\n<li>Jakarta Entreprise Bean 2.x and 1.x client view<\/li>\n\n\n\n<li>Jakarta Entreprise web service<\/li>\n<\/ul>\n\n\n\n<p>Vous trouverez le d\u00e9tail de la prochaine release&nbsp;<a href=\"https:\/\/eclipse-ee4j.github.io\/jakartaee-platform\/jakartaee9\/JakartaEE9ReleasePlan\">ici<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Et pour terminer Jakarta EE 10 la \u00ab&nbsp;Feature Release&nbsp;\u00bb<\/h4>\n\n\n\n<p>Pour cette version pr\u00e9vue fin 2020, rien n\u2019est encore d\u00e9fini. Tout ce que l\u2019on sait c\u2019est qu\u2019elle contiendra de nouvelles JSR et que son d\u00e9veloppement se fait en parall\u00e8le de la version 9.<br>La premi\u00e8re annonc\u00e9e sera une&nbsp;<a href=\"https:\/\/www.jnosql.org\/\">specification pour le NoSQL<\/a>&nbsp;proposant une API g\u00e9n\u00e9rique capable d\u2019interroger tous types de base de donn\u00e9es NoSQL (Clef-Valeur, Documents, Graph, \u2026)<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"695\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/makeChoiceThree.png\" alt=\"\" class=\"wp-image-213\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/makeChoiceThree.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/makeChoiceThree-300x204.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2020\/11\/makeChoiceThree-768x521.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">EN CONCLUSION<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Il y aura au minimum une release Jakarta EE tous les ans.<\/li>\n\n\n\n<li>Une release Eclipse MicroProfile sera publi\u00e9e tous les trimestres.<\/li>\n\n\n\n<li>L\u2019int\u00e9gralit\u00e9 de ces projets sont totalement OpenSourc\u00e9s.<\/li>\n\n\n\n<li>Ces serveurs sont plus flexibles, rapides et poss\u00e8dent une empreinte m\u00e9moire r\u00e9duite !<\/li>\n\n\n\n<li>Vous avez le choix ! De nombreuses impl\u00e9mentations sont disponibles sur le march\u00e9.<\/li>\n\n\n\n<li>Tous les g\u00e9ants de l\u2019industrie informatique contribuent; Oracle, RedHat, IBM, Apache, Eclipse, etc<\/li>\n<\/ol>\n\n\n\n<h5 class=\"wp-block-heading\">Comptes Twitter \u00e0 suivre<\/h5>\n\n\n\n<figure class=\"wp-block-embed-wordpress wp-block-embed is-type-wp-embed is-provider-eldermoraes-com\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/eldermoraes.com\/top-20-java-ee-experts-to-follow-on-twitter\/\n<\/div><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">R\u00e9f\u00e9rences<\/h5>\n\n\n\n<p><a href=\"https:\/\/www.eclipse.org\/\">https:\/\/www.eclipse.org\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/jakarta.ee\/\">https:\/\/jakarta.ee\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.baeldung.com\/java-enterprise-evolution\/\">https:\/\/www.baeldung.com\/java-enterprise-evolution\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/openliberty.io\/\">https:\/\/openliberty.io\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.payara.fish\/\">https:\/\/www.payara.fish\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/wildfly.org\/\">https:\/\/wildfly.org\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/projects.eclipse.org\/proposals\/eclipse-glassfish\">https:\/\/projects.eclipse.org\/proposals\/eclipse-glassfish<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/adam-bien.com\/\">http:\/\/adam-bien.com\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/rieckpil.de\/\">https:\/\/rieckpil.de\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/javaee-samples\/javaee8-samples\">https:\/\/github.com\/javaee-samples\/javaee8-samples<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/developer.mozilla.org\/fr\/docs\/Glossaire\/Test_de_fum%C3%A9e\">https:\/\/developer.mozilla.org\/fr\/docs\/Glossaire\/Test_de_fum%C3%A9e<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/microshed.org\/\">https:\/\/microshed.org\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le 10 septembre 2019, la fondation Eclipse publia sous licence opensource Jakarta EE 8. Pourquoi ce nom Jakarta EE ? Baaa,&nbsp;Jakarta&nbsp;c\u2019est la capitale de l\u2019Indon\u00e9sie. Elle est situ\u00e9e \u00e0 l\u2019extr\u00e9mit\u00e9 nord-ouest de l\u2019\u00eele de \u2026 Je vous le donne en mille,&nbsp;Java. Avant de rentrer dans les d\u00e9tails, revenons quelques temps en arri\u00e8re En 1999, la &hellip;<\/p>\n","protected":false},"author":1,"featured_media":120,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-66","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jakartaee"],"_links":{"self":[{"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/posts\/66","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/comments?post=66"}],"version-history":[{"count":53,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/posts\/66\/revisions"}],"predecessor-version":[{"id":1846,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/posts\/66\/revisions\/1846"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/media\/120"}],"wp:attachment":[{"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/media?parent=66"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/categories?post=66"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/tags?post=66"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}