Quarkus et la DevUI
Contexte
L’annonce de Quarkus a été faite en mars 2019 et la première release en novembre 2019. Le projet est jeune et mature par ses fondations.
Pour ceux qui connaissent déjà Quarkus, vous pouvez aller directement à la section Dev UI.
Le developpeur Java ne sera pas perdu car il va continuer à travailler avec des API connues commes JAX-RS, JPA et plein d’autres.
Pour les habitués à Spring, il existe des extensions pour assurer la compatibilité avec Spring DI, Spring Data JPA par exemple.
Le nombre d’extension est très important. Une extension est ni plus ni plus moins une dépendance du projet. Cela permet d’ajouter Hibernate, OpenAPI, Kafka.
Cependant, l’intérêt de l’extension est que cela permet de prendre en charge une partie du travail lors de la compilation pour améliorer les performances à l’exécution. Cela prend au compte aussi des opérations pour le support de GraalVM et de la compilation native.
Nous parlons souvent de Cloud Native. Mais les applications Quarkus fonctionnent avec un simple JDK et pas forcément dans un conteneur.
Comment commencer ?
Des commandes Maven existent pour la création du projet. Le plus simple, à mon avis, est de passer par le site https://code.quarkus.io/
Pour commencer, il suffit de renseigner :
-
Groupe Id
-
Artefact Id
-
Outil de construction : Maven ou Gradle
Puis, il suffit de choisir ces extensions.
Nous allons commencer par sélectionner uniquement l’extension RESTeasy JSON-B afin de réaliser des api REST.
Le petit avion après le nom de l’extension précise que du code d’exemple est fourni dans l’archive générée.
Nous téléchargeons et importons l’archive dans notre IDE. Et nous avons la structure du projet.
-
pom.xml
-
README.md
-
application.properties (dans le dossier
src/main/resources
)
un exemple d’implémentation JAX-RS dans le répertoire src/main/java
@Path("/hello-resteasy")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy";
}
}
mais aussi un test d’intégration dans le répertoire src/test/java
@Test
public void testHelloEndpoint() {
given()
.when().get("/hello-resteasy")
.then()
.statusCode(200)
.body(is("Hello RESTEasy"));
}
Pour l’exécution, il faut utiliser la cible quarkus:dev
qui permet notamment la recharge automatique de l’application lors des modifications du code.
mvn package quarkus:dev
Et voila, le tour est joué. L’API est disponible.
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
Powered by Quarkus 1.11.3.Final
2021-02-14 15:17:54,453 INFO [io.quarkus] (Quarkus Main Thread) 2021-02-Quarkus-DevUI 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.11.3.Final) started in 0.811s. Listening on: http://localhost:8080
2021-02-14 15:17:54,454 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2021-02-14 15:17:54,454 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy, resteasy-jsonb]
Lors du démarrage, l’application précise qu’elle écoute au port 8080. En prenant notre navigateur, nous obtenons la page suivante en allant http://localhost:8080 :
La page d’accueil et les ressources statiques sont disponibles dans le répertoire src/main/resources/META-INF/resources
.
Cette page nous indique que nous avons une ressource. Il nous reste simplement à cliquer sur le GET /hello-reasteasy pour appeler directement notre ressource et obtenir le message suivant : Hello RESTEasy
La Dev UI
C’est une page pour les développeurs qui a été introduite dans la version 1.11 de Quarkus (janvier 2021).
Elle est accessible via l’URI suivante /q/dev
, soit l’url : http://localhost:8080/q/dev/
Elle est disponible uniquement si nous sommes en mode dev.
Voici le résultat de l’affichage de cette page :
Le principe des panneaux
La page contient un certain nombre de panneau en fonction des extensions que nous avons sélectionnées. Dans notre cas, nous avons choisi RESTEasy JSON-B, donc c’est normale d’avoir les panneaux suivants :
-
RESTEasy JAX-RS
-
RESTEasy JSON-B
-
ArC, pour CDI
Cela correspond bien aux fonctionnalités installées comme mentionnées lors du démarrage
...(Quarkus Main Thread) Installed features: [cdi, resteasy, resteasy-jsonb]
Nous avons des panneaux supplémentaires liés aux dépendances :
-
Configuration, nécessaire pour la gestion des propriétés,
-
RESTEasy Server Common,
-
JSON-B, nécessaire car nous avons choisi l’implémentation JSON-B.
L’accès aux guides
Un point intéressant est qu' à chaque panneau correspond une petite icône bleu. C’est tout simplement un lien vers le guide approprié. Cela permet donc au développeur d’avoir l’ensemble des guides nécessaires en fonction des fonctionnalités installées.
L’accès aux informations
Propriétés
Nous avons un lien vers un éditeur de configuration. Cela permet de voir l’ensemble des propriétés utilisées lors de l’exécution :
-
Nom de la propriété,
-
Valeur de la propriété,
-
Valeur par défaut,
-
Source,
-
Description.
La source est intéressante car cela permet de savoir comment la valeur a été configurée :
-
SysPropConfigSource, pour les propriétés systèmes,
-
EnvConfigSource, pour les variables d’environnement,
-
PropertiesConfigSource[source=application.properties], pour le fichier application.properties,
-
PropertiesConfigSource[source=Build time config], pour le fichier application.properties dont les valeurs ont été précisées lors de la compilation,
-
default values, pour les valeurs prenant les valeurs par défaut.
La modification de la propriété est possible avec le bouton Update
. Ainsi, la propriété sera renseignée dans le fichier application.properties
CDI
Coté CDI, nous pouvons avoir des informations supplémentaires sur :
-
Beans
-
Observeurs
-
Beans supprimés
-
Intercepteurs
Par exemple, étant donné que nous avons sélectionné JSON-B, nous allons pouvoir vérifier la présence du Producteur CDI. Effectivement, nous voyons que le bean est bien présent sur la ligne n°8.
Naturellement, cela permettra de contrôler nos beans et leurs scopes.
L’accès à des URL techniques
Afin d’illuster ce point, nous allons utiliser l’extension concernant OpenAPI. Pour cela, il est nécessaire d’ajouter l’extension quarkus-smallrye-openapi
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-openapi</artifactId>
</dependency>
Nous pourrons noter qu’il suffit d’enregistrer le fichier pom.xml afin que l’application télécharge les dépendances via Maven et recharge l’application automatiquement.
Au redémarrage, nous avons deux nouvelles fonctionnalités smallrye-openapi
et swagger-ui
.
...(Quarkus Main Thread) Installed features: [cdi, resteasy, resteasy-jsonb, smallrye-openapi, swagger-ui]
Côté Dev UI, nous avons deux nouveaux panneaux :
-
SmallRye OpenAPI
-
Swagger UI
Nous pouvons remarquer que la panneau SmallRye OpenAPI possède deux liens :
-
OpenAPI, lien vers l’url pour récupérer la définition OpenAPI
/q/openapi
-
Swagger UI, lien vers la page Swagger UI
/q/swagger-ui
Voici la page Swagger UI de notre projet :
Ces liens existaient déjà dans les précédentes versions de Quarkus. Cependant, il fallait se rappeller des URI ou relire le guide associé pour les retrouver.
Changement : Il a été décidé que toutes les URI techniques commencent par /q
. Cela reste configurable via la propriété quarkus.http.non-application-root-path
. Actuellement, une redirection est faite entre les anciennes URL et les nouvelles.
Extension
Toujours dans la lignée de Quarkus, il est possible d’étendre la Dev UI à travers le développement d’une extension. Pour cela, nous avons le guide suivant : Guide pour étendre la Dev UI
Savoir créer une extension est un pré-requis. Un guide est aussi disponible pour cela.
Comment tester ?
Le projet java contenant le code présenté dans ce billet est disponible sur github
A vous de profiter des joies du développpeur !
Moteur de recherche
"Eduquer, ce n'est pas remplir des vases mais c'est d'allumer des feux." - Michel Montaigne
Billets récents
- Eclipse plante systématiquement sous Debian (et autres distribution Linux)
- JEP 463, Implicitly Declared Classes and Instance Main Methods (Second Preview)
- Debian - Montée de version de Debian 11 (Bullseye) à Debian 12 (Bookworm)
- JEP 451, Prepare to Disallow the Dynamic Loading of Agents
- JEP 444, Virtual Threads