DEV Community

loading...
Cover image for Usando o Quarkus como como uma aplicação de linha de comando

Usando o Quarkus como como uma aplicação de linha de comando

Aleatório
I have experience in leading good practices in software development, TDD, Java, Clean Code and Quarkus
Updated on ・5 min read

Apesar de ser um grande framework para desenvolvimento WEB, desenvolver pequenos programas com Quarkus era uma tarefa complicada e cheia de g̶a̶m̶b̶i̶a̶r̶r̶a̶s̶ soluções alternativas. Afinal, o Quarkus era apenas um framework para desenvolvimento WEB.

Caso o desenvolvedor quisesse fazer um programa que comessasse a executar logo após ser invocado e finalizasse após isso, era necessário usar algumas g̶a̶m̶b̶i̶a̶r̶r̶a̶s̶ soluções alternativas.

Além disso, não existia uma forma fácil de passar parâmetros para a aplicação e nem mesmo como fazer um pipe de execuções.

Isso mudou à partir da versão 1.4 do Quarkus. Essa versão trouxe várias melhorias, entre elas o modo de comando (command mode). Nesse artigo veremos o que é esse command mode e um pequeno passo-à-passo de como usá-lo.

O que é?

O modo de comando do Quarkus permite permite levantar uma aplicação Quarkus sem endpoints para REST e receber parâmetros por linha de comando.
Isso permite programar scripts ou aplicações de linha de commando tendo todo o poder do framework Quarkus.

Como usar

Como toda aplicação Quarkus, para utilizar, basta apenas adicionar o bom no arquivo pom.xml.

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-universe-bom</artifactId>
        <version>1.5.2.Final</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
</dependencyManagement>
Enter fullscreen mode Exit fullscreen mode

Também no pom.xml basta adicionar a dependência do quarkus-arc.

 <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-arc</artifactId>
 <dependency>
Enter fullscreen mode Exit fullscreen mode

Já na parte do código, basta adicionar a anotação @QuarkusMain na classe que será o entrypoint da aplicação e fazer ela implementar a interface QuarkusApplication e Voilá.
Todos os recursos do Quarkus estão disponíveis para nós usarmos.

Nisso, é só compilar com o comando

mvn clean install
Enter fullscreen mode Exit fullscreen mode

e a aplicação estará dentro do diretório ./target. Pronto para ser chamado com um "java -jar".

Exemplo de uso

Nesse pequeno exemplo, existem duas classes: ExamploModoComando e ServicoInjetado.

A classe ExamploModoComando é nossa classe de entrypoint. O programa começará rodar à partir do seu método run. Existem outras formas de chamar esse método e podem ser encontrados na documentação oficial.

Já classe ServicoInjetado é um bean gerenciável. Por isso precisa da anotação @Dependent e tem o seu @PostConstruct chamado (caso você seja iniciante, não precisa pensar muito no porquê disso).


import javax.inject.Inject;

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

@QuarkusMain
public class ExamploModoComando implements QuarkusApplication {

  @Inject
  ServicoInjetado servico;

  @Override
  public int run(String... args) throws Exception {

    if (args.length > 0) {
      servico.chamar(args[0]);
    } else {
      servico.chamar("");
    }

    return 0;
  }
}
Enter fullscreen mode Exit fullscreen mode

import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;

@Dependent
public class ServicoInjetado {

  @PostConstruct
  void postConstruct() {
    System.out.println("Sou um serviço injetado que funciona perfeitamente com CDI!");
  }


  void chamar(String variavel) {
    System.out.println("Fui chamado com a variável: " + variavel);
  }
}
Enter fullscreen mode Exit fullscreen mode

Executando essa classe usando um "java -jar", temos a seguinte saída:

 java -jar ./target/code-with-quarkus-1.0.0-SNAPSHOT-runner.jar Parâmetro 
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2020-07-06 19:00:30,838 INFO  [io.quarkus] (main) code-with-quarkus 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.5.2.Final) started in 0.191s. 
2020-07-06 19:00:30,852 INFO  [io.quarkus] (main) Profile prod activated. 
2020-07-06 19:00:30,852 INFO  [io.quarkus] (main) Installed features: [cdi]
Sou um serviço injetado que funciona perfeitamente com CDI!
Fui chamado com a variável: Parâmetro
2020-07-06 19:00:30,855 INFO  [io.quarkus] (main) code-with-quarkus stopped in 0.003s
Enter fullscreen mode Exit fullscreen mode

Dicas, truques e informações

O modo de comando já vem por padrão

Uma classe feita pelo gerador do quarkus tem como dependência o quarkus-resteasy que já traz o quarkus-arc como dependência transitiva.

Como fazer uma saída mais limpa

Uma boa aplicação de linha de comando não fala nada se não tiver nada de surpreendente a dizer.
Para retirar os logs colocados é só alterar o arquivo application.proprties e adicionar o seguinte texto.

quarkus.log.level=SEVERE
quarkus.hibernate-orm.log.sql=false
quarkus.banner.enabled=false
Enter fullscreen mode Exit fullscreen mode

Isso mudará a saída do programa para algo do tipo:

java -jar ./target/code-with-quarkus-1.0.0-SNAPSHOT-runner.jar Parâmetro
Sou um serviço injetado que funciona perfeitamente com CDI!
Fui chamado com a variável: Parâmetro
Enter fullscreen mode Exit fullscreen mode

Como passar parâmetros em modo de desenvolvimento

Normalmente, quando desenvolvemos, executamos com o comando mvn quarkus:dev. Para passar parâmetros, basta usar o parâmetro -Dquarkus.args=parâmetro.

Isso permite debugar, traz o hot reload, altera o perfil para o dev entre outras coisas. O código o código executando o comando o resultado será mais ou menos o seguinte:

mvn quarkus:dev -Dquarkus.args=Parâmetro
executing mvnw instead of mvn
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< org.acme:code-with-quarkus >---------------------
[INFO] Building code-with-quarkus 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- quarkus-maven-plugin:1.5.2.Final:dev (default-cli) @ code-with-quarkus ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /home/aleatorio/VisualCodeProjects/postagem_quarkus/quarkus-command-mode/target/classes
Listening for transport dt_socket at address: 5005
Sou um serviço injetado que funciona perfeitamente com CDI!
Fui chamado com a variável: Parâmetro
Quarkus application exited with code 0
Press Enter to restart or Ctrl + C to quit

Enter fullscreen mode Exit fullscreen mode

Considerações

Já usei algumas g̶a̶m̶b̶i̶a̶r̶r̶a̶s̶ soluções alternativas porque queria usar as vantagens do Quarkus em pequenos pequenos programas e utilitários para o dia-à-dia. O modo de comando veio como uma luva para mim. Ainda mais, quando posso compilar a aplicação em modo nativo para ter um programa pequeno e rápido.

Confesso que não uso para scripts extramemnte simples, pois prefiro usar direto o bash. Mas em pequenos programas e utilitários mais complexos tenho usado bastante o Quarkus em linha de comando e tem sido uma ótima experiência.

Ah e o código de hoje pode ser encontrado em inglês no git.

Discussion (0)