Skip to main content
Version: 8.5

Getting started

This project allows you to leverage Zeebe APIs (gRPC and REST) in your Spring Boot project. Later on, we’ll expand the Spring Zeebe SDK to deliver a Camunda Spring SDK that provides a unified experience for interacting with all Camunda APIs in Java Spring.

Version compatibility

Camunda Spring SDK versionJDKCamunda versionBundled Spring Boot version
8.5.x>= 178.5.x3.2.x

Add the Spring Zeebe SDK to your project

Add the following repository and Maven dependency to your Spring Boot Starter project:

<name>Camunda Identity</name>

Enable the Java Compiler -parameters-flag

If you don't want to specify annotation values just as the process variable name on the variable annotation, the Java compiler flag -parameters is required.

If you are using Maven you can enable this with the Compiler plugin:


If you are using Gradle:

tasks.withType(JavaCompile) {
options.compilerArgs << '-parameters'

If you are using IntelliJ:

Settings > Build, Execution, Deployment > Compiler > Java Compiler

Configuring the Zeebe cluster connection

Connections to Camunda 8 SaaS can be configured by creating the following entries in src/main/resources/

You can also configure the connection to a Self-Managed Zeebe broker:

Example of configuring the connection to a Self-Managed Zeebe cluster:

The property above is the Keycloak token endpoint.

You can also configure the connection to a Self-Managed Zeebe cluster using environment variables and specifying your gateway address:

Environment variable to be set using this approach:


Properties to be set using this approach:

You can enforce the right connection mode, for example if multiple contradicting properties are set:


Obtain the Zeebe client

You can inject the Zeebe client and work with it to create new workflow instances, for example:

private ZeebeClient client;

Deploy process models

Use the @Deployment annotation:

@Deployment(resources = "classpath:demoProcess.bpmn")
public class MySpringBootApplication {

This annotation internally uses the Spring resource loader mechanism. This is powerful, and can also deploy multiple files at once, for example:

@Deployment(resources = {"classpath:demoProcess.bpmn" , "classpath:demoProcess2.bpmn"})

Or, define wildcard patterns:

@Deployment(resources = "classpath*:/bpmn/**/*.bpmn")

Implement the job worker

@JobWorker(type = "foo")
public void handleJobFoo(final ActivatedJob job) {
// do whatever you need to do

See the configuration documentation for a more in-depth discussion on parameters and configuration options of job workers.