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>
Também no pom.xml basta adicionar a dependência do quarkus-arc.
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
<dependency>
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
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;
}
}
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);
}
}
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
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
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
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
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.
Top comments (0)