adam bien's blog

A Command Line Application with Quarkus 📎

To create a command line application with quarkus (aka Command Mode), annotate the "main" class with @QuarkusMain and implement the QuarkusApplication interface.

After the execution of the method run quarkus will automatically shutdown:


import javax.inject.Inject;

import io.quarkus.runtime.QuarkusApplication;
import io.quarkus.runtime.annotations.QuarkusMain;

@QuarkusMain
public class SuperSonicApp implements QuarkusApplication {
    
    @Inject
    Messenger supplier;

    @Override
    public int run(String... args) throws Exception {
        System.out.println("Message from messenger: " + this.supplier.message());
        return 42; //exit code
    }
    
}    

Dependency injection, microprofile features etc. are working as expected. The message property defined in application.properties:


message=hey duke

is injectable:


import javax.enterprise.context.Dependent;
import javax.inject.Inject;

import org.eclipse.microprofile.config.inject.ConfigProperty;

@Dependent
public class Messenger {

    @Inject
    @ConfigProperty(name = "message")
    String message;

    public String message() {
        return this.message;
    }
}

The application generates the following output and stops:


INFO  [io.quarkus] (main) supersonic-main 1.0-SNAPSHOT (powered by Quarkus 1.4.2.Final) started in 0.248s.
INFO  [io.quarkus] (main) Profile prod activated.
INFO  [io.quarkus] (main) Installed features: [cdi]
Message from messenger: hey duke
INFO  [io.quarkus] (main) supersonic-main stopped in 0.003s

Command mode already ships with quarkus runtime, there are no additional extensions needed. In the example above CDI and MicroProfile Config were used, which ship with:


<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-arc</artifactId>
</dependency>

In code executed from the "main" method there are no incoming requests. Therefore scopes like e.g. @RequestScoped are not available.

The request scope can be activated with: ActivateRequestContext CDI 2.0 annotation.