Documentation

Documentation versions (currently viewingVaadin 23)

Using Quarkus With Vaadin

Quarkus is an open source, Kubernetes-native Java framework made for Java virtual machines and native compilation. It optimizes Java specifically for containers, enabling it to become an effective platform for serverless, cloud, and Kubernetes environments. See https://quarkus.io for more information about Quarkus.

Starting a Project

To start a new project with Quarkus and Vaadin, you can get a project base from Quarkus base starter. This is a project template with the necessary configuration and dependencies included for starting to build your own application.

This starter is also available with Gradle configuration in the Gradle branch.

Manual Setup

To be able to run your existing project with Quarkus, you need to have the vaadin-quarkus and vaadin-jandex Maven dependencies in the project, as well as to configure the quarkus-maven-plugin.

For example:

<dependencyManagement>
    <dependencies>
        <!-- Quarkus Platform BOM to keep the project
             artifacts in synch with the quarkus.version -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-bom</artifactId>
            <version>${quarkus.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- Vaadin Platform BOM -->
        <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-bom</artifactId>
            <type>pom</type>
            <scope>import</scope>
            <version>${vaadin.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- The Vaadin Quarkus extension -->
    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-quarkus-extension</artifactId>
        <version>${vaadin.version}</version>
    </dependency>

    <!-- The jandex.idx for Vaadin-core annotation indexes
         automatically included via vaadin-quarkus-extension
         and is used as an offline reflection library.

         If you want to work with Pro components such GridPro,
         you can uncomment the following dependency to include the
         officially provided jandex.idx for them as well: -->
    <!--
    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-jandex</artifactId>
    </dependency>
    -->

    <!-- Quarkus always pulls in slf4j-jboss-logmanager
         into target/lib; don't use slf4j-simple -->
    <dependency>
        <groupId>org.jboss.slf4j</groupId>
        <artifactId>slf4j-jboss-logmanager</artifactId>
        <version>1.1.0.Final</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- For indepth information on quarkus-maven-plugin
             see https://quarkus.io/guides/maven-tooling#build-tool-maven -->
        <plugin>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-maven-plugin</artifactId>
            <version>${quarkus.version}</version>
            <extensions>true</extensions>
            <executions>
                <execution>
                    <goals>
                        <!-- Builds the Quarkus application -->
                        <goal>build</goal>
                        <!-- in these goals the Quarkus application bootstrap
                             is initialized and re-used in the build goal -->
                        <goal>generate-code</goal>
                        <goal>generate-code-tests</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Vaadin CDI Features

Quarkus’s dependency injection solution is based on CDI, so it is possible to use all the CDI features.

See the documentation for Vaadin CDI features:

Vaadin Add-Ons in Quarkus Applications

Any Vaadin add-on used in a Quarkus application should contain a Jandex index. You can generate this using the jandex-maven-plugin. See How to Generate a Jandex Index.

If you cannot modify the dependency, you can still get Quarkus to index it by adding quarkus.index-dependency entries to your application.properties:

quarkus.index-dependency.<name>.group-id=
quarkus.index-dependency.<name>.artifact-id=
quarkus.index-dependency.<name>.classifier=(this one is optional)

The <name> string here is used to link the group-id, artifact-id and classifier entries in one logical block. It should be the same for those three entries and be any string literal.

Running the Application in Development Mode

After making Manual Setup steps, the Quarkus application can be started in development mode using the quarkus:dev goal in Maven.

mvn package quarkus:dev

The application is then available at localhost:8080 in the browser.

Running the Application in Production Mode

The Quarkus base starter already includes the necessary Maven configuration to run the application in production mode. If you use a project not based on the starter, this needs the configuration described in Deploying to Production.

Run the following commands to start the application:

mvn package -Pproduction
java -jar target/quarkus-app/quarkus-run.jar

Live Reload

Live reload functionality is supported for changes in either Java or front-end files.

When running in development mode (quarkus:dev), changes in Java or front-end files compile after saving and will show up after the browser page is refreshed. For front-end changes the browser page is automatically reloaded, but for Java changes a manual refresh is required. Furthermore, Java hot reload may sometimes break front-end live reload; if this happens, server needs to be restarted.

Known Issues

Quarkus BOM pins Google Guava library to a version that conflicts with Vaadin TestBench 8 and later, resulting in test failures because of changes in method signatures. This can be fixed by adding an explicit entry for Guava version 31.0.1-jre in the dependency management section of the project’s pom.xml file, immediately above the reference to Quarkus BOM.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.0.1-jre</version>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-bom</artifactId>
            <version>${quarkus.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        ...
    </dependencies>
</dependencyManagement>