Cette page boot un service complet REST + DI + persistence H2 avec Vidocq Runtime, package l’application via le plugin Maven dédié, et l’exécute en mode java -jar. L’exemple correspond à vidocq-runtime-mansart-h2-example du reactor.
Pré-requis
-
Java 25 (Temurin recommandé)
-
Maven 3.9.16 — pinné via
.sdkmanrc(sdk env) -
Connaissance basique de Jakarta REST, CDI Lite et MicroProfile Config
Coordonnées Maven
<dependencies>
<dependency>
<groupId>io.vidocq.runtime</groupId>
<artifactId>vidocq-runtime-core</artifactId>
<version>0.1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.vidocq.runtime</groupId>
<artifactId>vidocq-runtime-cassini-rest-extension</artifactId>
<version>0.1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.vidocq.runtime</groupId>
<artifactId>vidocq-runtime-mansart-extension</artifactId>
<version>0.1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.x</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>io.vidocq.runtime</groupId>
<artifactId>vidocq-runtime-maven-plugin</artifactId>
<version>0.1.0-SNAPSHOT</version>
<executions>
<execution>
<goals>
<goal>build</goal>
<goal>jlink</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Étape 1 — Une entité + un repository
package io.example.todo;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
public class Todo {
@Id @GeneratedValue Long id;
String label;
boolean done;
// accesseurs
}
package io.example.todo;
import jakarta.data.repository.CrudRepository;
import jakarta.data.repository.Repository;
@Repository
public interface TodoRepository extends CrudRepository<Todo, Long> {}
Mansart génère l’implémentation via APT au build. Aucune classe runtime n’est instanciée par réflexion.
Étape 2 — Une ressource REST
package io.example.todo;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
@Path("/api/todos")
@ApplicationScoped
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class TodoResource {
@Inject TodoRepository repo;
@GET
public Iterable<Todo> list() {
return repo.findAll();
}
@POST
public Todo create(Todo input) {
return repo.save(input);
}
}
Le scope @RequestScoped est ajouté automatiquement par la Build Compatible Extension RestScopeExtension côté Vauban.
Étape 3 — Point d’entrée
package io.example.todo;
public class App {
public static void main(String[] args) {
io.vidocq.runtime.Vidocq.main(args);
}
}
Vidocq.main(args) orchestre la séquence de boot complète. Voir Fonctionnement interne.
Étape 4 — Configuration MicroProfile
src/main/resources/vidocq.properties :
# transport (Chappe)
vidocq.http.host=0.0.0.0
vidocq.http.port=8080
# datasource (Mansart)
vidocq.datasource.url=jdbc:h2:mem:todo
vidocq.datasource.username=sa
vidocq.datasource.password=
Toute clé est surchargeable via -Dkey=value, variables d’environnement, ou un fichier externe (voir Usage).
Étape 5 — Build et exécution
sdk env
./mvnw -ntp package -DskipTests
java -jar target/quickstart-runner.jar
# ou en mode jlink (image autonome — pas de java requis) :
./target/dist/bin/quickstart
$ curl -X POST http://localhost:8080/api/todos \
-H 'Content-Type: application/json' \
-d '{"label":"écrire la doc","done":false}'
$ curl http://localhost:8080/api/todos
[{"id":1,"label":"écrire la doc","done":false}]