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}]

Pour aller plus loin