<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arthur Fonseca</title>
    <description>The latest articles on DEV Community by Arthur Fonseca (@arthurfnsc).</description>
    <link>https://dev.to/arthurfnsc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F87316%2Fa4cff5ea-b7ef-4c19-97dc-dd0c44fd6afe.jpg</url>
      <title>DEV Community: Arthur Fonseca</title>
      <link>https://dev.to/arthurfnsc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arthurfnsc"/>
    <language>en</language>
    <item>
      <title>Cursos que formaram meu caráter: Desenvolvimento web com Quarkus - Validação de vulnerabilidades com OWASP Dependency Check</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Sun, 18 Dec 2022 03:05:26 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-validacao-de-vulnerabilidades-com-owasp-dependency-check-2a2l</link>
      <guid>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-validacao-de-vulnerabilidades-com-owasp-dependency-check-2a2l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"Mais visibilidade é mais poder, mas mais vulnerabilidade".  Ezra Furman&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse sétimo post falaremos sobre vulnerabilidades em bibliotecas. Se você trabalha com Java há algum tempo, creio que a vulnerabilidade do log4j possa ter te dado algumas dores de cabeça.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/RnRXNN6S8XQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/R1m7GHMmUvA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Como desenvolvedores, um ponto que falaremos é o que fazer quando descobrirmos um vulnerabilidade. Lembre-se que:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Para todo problema complexo existe sempre uma solução simples, elegante e completamente errada". H L Mencken&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esse artigo faz parte de uma série, abaixo é possível encontrar a lista completa de artigos.&lt;/p&gt;

&lt;p&gt;Estamos nos baseando no curso &lt;a href="https://www.udemy.com/course/des-web-quarkus"&gt;Desenvolvimento web com Quarkus&lt;/a&gt; do &lt;a class="mentioned-user" href="https://dev.to/viniciusfcf"&gt;@viniciusfcf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O repositório que estamos utilizando é:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Eo8_psp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gitlab.com/assets/twitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" height="880" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" rel="noopener noreferrer" class="c-link"&gt;
          udemy / Desenvolvimento Web com Quarkus / ifood · GitLab
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          GitLab.com
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Sy_zlNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gitlab.com/assets/favicon-72a2cad5025aa931d6ea56c3201d1f18e68a8cd39788c7c80d5b2b82aa5143ef.png" width="32" height="32"&gt;
        gitlab.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Vulnerabilidades
&lt;/h2&gt;

&lt;p&gt;Em TI temos uma máxima de que não existe sistema perfeito! Mesmo soluções que funcionam sem nenhum problema aparente podem apresentar problemas desconhecidos ou novos problemas dado a evolução de outras bibliotecas ou mesmo outros problemas.&lt;/p&gt;

&lt;p&gt;O cenário do &lt;strong&gt;Log4J&lt;/strong&gt; aconteceu recentemente, e o pessoal do &lt;a href="https://www.coffeeandit.store/"&gt;Coffee and IT&lt;/a&gt; até fez um vídeo explicando com um viés de desenvolvimento.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/NHJoy-lVBMg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Algumas perguntas podem ficar em nossas cabeça:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como saber mais sobre vulnerabilidades de bibliotecas?&lt;/li&gt;
&lt;li&gt;O que fazer quando descobrir uma vulnerabilidade em meu código?&lt;/li&gt;
&lt;li&gt;Será que consigo automatizar de alguma forma a descoberta dessas vulnerabilidades?&lt;/li&gt;
&lt;li&gt;Dentre outras&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  OWASP e CVE
&lt;/h3&gt;

&lt;p&gt;Um dos pontos de início pode ser a &lt;strong&gt;OWASP&lt;/strong&gt; (The Open Web Application Security Project).&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://owasp.org/" rel="noopener noreferrer"&gt;
      owasp.org
    &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;A &lt;strong&gt;OWASP&lt;/strong&gt; é uma fundação sem fins lucrativos que trabalha para melhorar a segurança do software. Eles possuem &lt;strong&gt;Chapters&lt;/strong&gt; em vários países, bem como realizam uma série de eventos com esse foco.&lt;/p&gt;

&lt;p&gt;Uma de suas publicações mais conhecidas é o &lt;strong&gt;OWASP Top Ten&lt;/strong&gt; em que são documentadas as 10 maiores vulnerabilidades dados um período de tempo.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://owasp.org/www-project-top-ten/" rel="noopener noreferrer"&gt;
      owasp.org
    &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Outro termo que falaremos também é o &lt;a href="https://cve.mitre.org/"&gt;CVE&lt;/a&gt; (Common Vulnerabilities and Exposures). No &lt;a href="https://mvnrepository.com/"&gt;Maven Repo&lt;/a&gt; é bem comum ver uma observação quando estamos buscando uma biblioteca.&lt;/p&gt;

&lt;p&gt;Note que a &lt;a href="https://mvnrepository.com/artifact/io.quarkus/quarkus-junit5/2.15.0.Final"&gt;versão 2.15.0.Final do Quarkus JUnit 5&lt;/a&gt; nos apresenta alguns alertas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0eoj_B9E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/daqzo66lahycols05ul0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0eoj_B9E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/daqzo66lahycols05ul0.png" alt="quarkus-junit5 vulnerabilities" width="880" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olhando um pouco mais para as versões do &lt;strong&gt;quarkus-junit5&lt;/strong&gt; podemos ver que para a versão 2 do &lt;strong&gt;Quarkus&lt;/strong&gt; ainda não temos nenhuma correção para essas vulnerabilidades.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hnrwGmYu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6tmx47okx7um8omaojhp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hnrwGmYu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6tmx47okx7um8omaojhp.png" alt="quarkus-junit5 versions" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Estou vulnerável, e agora?
&lt;/h3&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://giphy.com/gifs/dexter-showtime-new-blood-dexter-OjmuV9ZKkM5qoSTQ8c" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--i0Hbkj0r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media2.giphy.com/media/OjmuV9ZKkM5qoSTQ8c/giphy.gif%3Fcid%3D790b7611e0a9e0734920b8ce5080d29a60edc1c0dc3e732e%26rid%3Dgiphy.gif%26ct%3Dg" height="202" class="m-0" width="480"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://giphy.com/gifs/dexter-showtime-new-blood-dexter-OjmuV9ZKkM5qoSTQ8c" rel="noopener noreferrer" class="c-link"&gt;
          New Blood Showtime GIF by Dexter - Find &amp;amp; Share on GIPHY
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Discover &amp;amp; share this Dexter GIF with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--EnkhlOxW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://giphy.com/static/img/favicon.png" width="16" height="16"&gt;
        giphy.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Um insight legal que recomendo a todos desenvolvedores é: converse com pessoas de outras áreas para formar uma opinião.&lt;/p&gt;

&lt;p&gt;Como desenvolvedores é bem comum acharmos vulnerabilidades e já pensarmos em subir novas versões ou já colocar a mão no código.&lt;/p&gt;

&lt;p&gt;Há uns anos atrás tive uma conversa com o &lt;a href="https://www.linkedin.com/in/brunoslalmeida/"&gt;Bruno Almeida&lt;/a&gt; na &lt;a href="https://ilia.digital/"&gt;ília Digital&lt;/a&gt;; ele por ter um background em segurança me fez exatamente essa pergunta, questionando sobre o que eu faria.&lt;/p&gt;

&lt;p&gt;Falei que iria atualizar as bibliotecas, alterar o código e coisas do tipo.&lt;/p&gt;

&lt;p&gt;Ele então me trouxe um outro ponto de vista bem interessante: Será que preciso atualizar o código? Será que a vulnerabilidade que tenho é passível de ser explorada? Algumas vezes trabalhamos com APIs e diversas camadas como &lt;strong&gt;microservices&lt;/strong&gt;, &lt;strong&gt;API Gateway&lt;/strong&gt; dentre outras, e pode ser que uma fez configurado algo em uma camada superior, não seja passível de se explorar a vulnerabilidade.&lt;/p&gt;

&lt;p&gt;O ponto então que ficou em minha mente foi: é importante descobrir as vulnerabilidades que estamos expostos, em seguida entender se essas vulnerabilidades são passíveis de serem exploradas, e caso sejam passíveis de serem exploradas, analisar o impacto de correção nos pontos de nossa solução em que tal vulnerabilidade pode ser explorada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatizando a descoberta de possíveis vulnerabilidades
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;OWASP&lt;/strong&gt; tem um projeto bem interessante, o &lt;strong&gt;Dependency-Check&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://owasp.org/www-project-dependency-check/" rel="noopener noreferrer"&gt;
      owasp.org
    &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Ele possui uma série de plugins e integrações que podemos usar para descobrir &lt;strong&gt;CVEs&lt;/strong&gt; no nosso projeto.&lt;/p&gt;

&lt;p&gt;No arquivo &lt;strong&gt;build.gradle&lt;/strong&gt; do nosso projeto podemos ver a primeira parte da configuração do plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s2"&gt;"org.owasp.dependencycheck"&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="s2"&gt;"$dependencyCheckVersion"&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;subprojects&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;'applications'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/security.gradle"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;E no arquivo &lt;strong&gt;plugins/security.gradle&lt;/strong&gt; podemos ver a segunda parte da configuração:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s2"&gt;"org.owasp.dependencycheck"&lt;/span&gt;

&lt;span class="n"&gt;dependencyCheck&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;autoUpdate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="n"&gt;format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ALL"&lt;/span&gt;
    &lt;span class="n"&gt;outputDirectory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"build/reports/dependencyCheck"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Para a lista de demais configurações, acesse o &lt;a href="https://jeremylong.github.io/DependencyCheck/dependency-check-gradle/configuration.html"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A task que iremos utilizar para executar o plugin será a &lt;strong&gt;dependencyCheckAnalyze&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essa task busca as vulnerabilidades associadas a nossas dependências e nos da um detalhamento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kW4qwjY6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eld9te9e6lurdywnvqoz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kW4qwjY6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eld9te9e6lurdywnvqoz.png" alt="Dependency Check" width="880" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abrindo o arquivo &lt;strong&gt;dependency-check-report.html&lt;/strong&gt; temos o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cwc-nUt9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2qoukrr1n2fp5dvu8m37.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cwc-nUt9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2qoukrr1n2fp5dvu8m37.png" alt="dependency-check-report.html" width="880" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Além de informar as bibliotecas que temos vulnerabilidades, o plugin consegue obter mais detalhes sobre o problema, situações em que ele acontece e às vezes até direcionamentos sobre a solução. No caso da venerabilidade no &lt;strong&gt;okhttp-3.14.9.jar&lt;/strong&gt; temos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--siRDVgxH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kft7u09u2ua96l9bdk5v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--siRDVgxH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kft7u09u2ua96l9bdk5v.png" alt="okhttp-3.14.9.jar" width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In verifyHostName of OkHostnameVerifier.java, there is a possible way to accept a certificate for the wrong domain due to improperly used crypto. This could lead to remote information disclosure with no additional execution privileges needed. User interaction is not needed for exploitation.Product: AndroidVersions: Android-8.1 Android-9 Android-10 Android-11Android ID: A-171980069&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Integração com SonarQube
&lt;/h3&gt;

&lt;p&gt;Outra coisa que podemos fazer é instalar o plugin no nosso &lt;a href="https://www.sonarqube.org/"&gt;SonarQube&lt;/a&gt; e assim termos uma rastreabilidade de vulnerabilidades como parte do nosso relatório do projeto.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/dependency-check"&gt;
        dependency-check
      &lt;/a&gt; / &lt;a href="https://github.com/dependency-check/dependency-check-sonar-plugin"&gt;
        dependency-check-sonar-plugin
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Integrates Dependency-Check reports into SonarQube
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Dependency-Check Plugin for SonarQube 8.x and 9.x&lt;/h1&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/dependency-check/dependency-check-sonar-plugin/workflows/build/badge.svg?branch=master"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VWA8CS9k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/dependency-check/dependency-check-sonar-plugin/workflows/build/badge.svg%3Fbranch%3Dmaster" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://www.codacy.com/gh/dependency-check/dependency-check-sonar-plugin/dashboard?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_content=dependency-check/dependency-check-sonar-plugin&amp;amp;utm_campaign=Badge_Grade" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/acd6abd818ce8a7bf8576ff4bc3b8b5e25a4a490636378e182a38bcd0a41701e/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f6539636562643331313265633432353238303462626136386135623434303731" alt="Codacy Badge"&gt;&lt;/a&gt;
&lt;a href="https://github.com/dependency-check/dependency-check-sonar-plugin/releases/latest"&gt;&lt;img src="https://camo.githubusercontent.com/e992c11d1d0a58f95ec770f73618f8492bad2657e950b282664528de98a90970/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646570656e64656e63792d636865636b2f646570656e64656e63792d636865636b2d736f6e61722d706c7567696e" alt="Download"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2b2710f4851bfc7888062aac1d0de712cfebba9802fe052b8bf68ee355f0e304/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f646570656e64656e63792d636865636b2f646570656e64656e63792d636865636b2d736f6e61722d706c7567696e2f746f74616c"&gt;&lt;img src="https://camo.githubusercontent.com/2b2710f4851bfc7888062aac1d0de712cfebba9802fe052b8bf68ee355f0e304/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f646570656e64656e63792d636865636b2f646570656e64656e63792d636865636b2d736f6e61722d706c7567696e2f746f74616c" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://sonarcloud.io/dashboard?id=dependency-check_dependency-check-sonar-plugin" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/c99528f081e478c988c869b5a52b532e0deddac1acc5e7f1897e3cc79c09fa89/68747470733a2f2f736f6e6172636c6f75642e696f2f6170692f70726f6a6563745f6261646765732f6d6561737572653f70726f6a6563743d646570656e64656e63792d636865636b5f646570656e64656e63792d636865636b2d736f6e61722d706c7567696e266d65747269633d616c6572745f737461747573" alt="Quality Gate Status"&gt;&lt;/a&gt;
&lt;a href="https://sonarcloud.io/dashboard?id=dependency-check_dependency-check-sonar-plugin" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/610d9a18a0a141f758b48f416df0278827effe9814a95e0ce6b2ff174aedb5ad/68747470733a2f2f736f6e6172636c6f75642e696f2f6170692f70726f6a6563745f6261646765732f6d6561737572653f70726f6a6563743d646570656e64656e63792d636865636b5f646570656e64656e63792d636865636b2d736f6e61722d706c7567696e266d65747269633d636f766572616765" alt="Coverage"&gt;&lt;/a&gt;
&lt;a href="https://sonarcloud.io/dashboard?id=dependency-check_dependency-check-sonar-plugin" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/7d465416f660822928cbde1a2b4ec6da063b0e02869e0f90a2be32401538add3/68747470733a2f2f736f6e6172636c6f75642e696f2f6170692f70726f6a6563745f6261646765732f6d6561737572653f70726f6a6563743d646570656e64656e63792d636865636b5f646570656e64656e63792d636865636b2d736f6e61722d706c7567696e266d65747269633d73656375726974795f726174696e67" alt="Security Rating"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Integrates &lt;a href="https://www.owasp.org/index.php/OWASP_Dependency_Check" rel="nofollow"&gt;Dependency-Check&lt;/a&gt; reports into SonarQube v8.9 or higher.&lt;/p&gt;
&lt;p&gt;The project will try to backport all code from master branch to last supported LTS. Please see the &lt;a href="https://github.com/dependency-check/dependency-check-sonar-plugin/tree/SonarQube_6.x"&gt;SonarQube 6.x&lt;/a&gt; or &lt;a href="https://github.com/dependency-check/dependency-check-sonar-plugin/tree/SonarQube_7.x"&gt;SonarQube 7.x&lt;/a&gt; branch for old supported version.&lt;/p&gt;
&lt;h2&gt;
About Dependency-Check&lt;/h2&gt;
&lt;p&gt;Dependency-Check is a utility that attempts to detect publicly disclosed vulnerabilities contained within project dependencies. It does this by determining if there is a Common Platform Enumeration (CPE) identifier for a given dependency. If found, it will generate a report linking to the associated CVE entries.&lt;/p&gt;
&lt;p&gt;Dependency-Check supports the identification of project dependencies in a number of different languages including Java, .NET, Node.js, Ruby, and Python.&lt;/p&gt;
&lt;h2&gt;
Note&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;This SonarQube plugin does not perform analysis&lt;/strong&gt;, rather, it reads existing Dependency-Check reports. Use one of the other available methods to scan project dependencies and generate the necessary JSON report which can then be consumed by this…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/dependency-check/dependency-check-sonar-plugin"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  Ignorando falsos positivos
&lt;/h3&gt;

&lt;p&gt;É possível ainda ignorar falsos positivos através da configuração &lt;strong&gt;suppressionFile&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://jeremylong.github.io/DependencyCheck/general/suppression.html" rel="noopener noreferrer"&gt;
      jeremylong.github.io
    &lt;/a&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;OWASP Dependency Check&lt;/strong&gt; é um plugin fantástico que pode nos ajudar na descoberta de vulnerabilidades em nossos projetos. Uma consideração é avaliarmos o impacto de tais vulnerabilidades em nossos códigos, além do custo de correção caso seja o nosso caso.&lt;/p&gt;

&lt;p&gt;No próximo post falaremos do último plugin utilizado no projeto. Ele será bem importante para formatação do nosso código &lt;strong&gt;Groovy&lt;/strong&gt;, &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;SQL&lt;/strong&gt;, dentre outros.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse post faz parte de uma série sobre &lt;strong&gt;Cursos que formaram meu caráter: Desenvolvimento web com Quarkus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A série completa é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-talk-is-cheap-show-me-the-code-2k91"&gt;Talk is cheap show me the code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn"&gt;Utilizando Gradle ao invés de Maven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na"&gt;Plugins do Gradle: Gerenciador de versões de bibliotecas com Versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-saudades-do-maven-relatorios-com-project-report-51d6"&gt;Plugins do Gradle: Saudades do  Maven, relatórios com Project-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm"&gt;Plugins do Gradle: API First com o OpenAPI Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-para-apis-reativas-3o9b"&gt;Plugins do Gradle: API First com o OpenAPI Generator para APIs reativas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: Validação de vulnerabilidades de dependências com OWASP Dependency Check&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: Lint com Spotless [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Motivação para a escolha [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Considerações sobre o Prettier em pipelines [não publicado]&lt;/li&gt;
&lt;li&gt;Gitmoji [não publicado]&lt;/li&gt;
&lt;li&gt;SDK Man [não publicado]&lt;/li&gt;
&lt;li&gt;Pré commit hook [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando YML em propriedades de aplicação [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando variáveis de ambiente [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Sobrescrevendo opções em teste [não publicado]&lt;/li&gt;
&lt;li&gt;Mapstruct: Utilizando expressões para mapeamentos [não publicado]&lt;/li&gt;
&lt;li&gt;Microprofile SecurityScheme: Sobrescrevendo tokenUrl [não publicado]&lt;/li&gt;
&lt;li&gt;Prometheus: O problema simples que me custou algumas horas [não publicado]&lt;/li&gt;
&lt;li&gt;quarkus-hibernate-reactive-panache: Utilizando as vantagens do Hibernate em projetos reativos [não publicado]&lt;/li&gt;
&lt;li&gt;Testcontainers: Configuração para projetos reativos [não publicado]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>owasp</category>
      <category>dependencycheck</category>
      <category>gradle</category>
      <category>cve</category>
    </item>
    <item>
      <title>Cursos que formaram meu caráter: Desenvolvimento web com Quarkus - API First com o OpenAPI Generator para APIs reativas</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Sat, 17 Dec 2022 21:12:42 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-para-apis-reativas-3o9b</link>
      <guid>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-para-apis-reativas-3o9b</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"Todo ato de criação é, antes de tudo, um ato de destruição" Pablo Picasso&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Neste sexto post falaremos sobre geração de APIs reativas.&lt;/p&gt;

&lt;p&gt;Esse artigo faz parte de uma série, abaixo é possível encontrar a lista completa de artigos.&lt;/p&gt;

&lt;p&gt;Estamos nos baseando no curso &lt;a href="https://www.udemy.com/course/des-web-quarkus"&gt;Desenvolvimento web com Quarkus&lt;/a&gt; do &lt;a class="mentioned-user" href="https://dev.to/viniciusfcf"&gt;@viniciusfcf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O repositório que estamos utilizando é:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Eo8_psp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gitlab.com/assets/twitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" height="880" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" rel="noopener noreferrer" class="c-link"&gt;
          udemy / Desenvolvimento Web com Quarkus / ifood · GitLab
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          GitLab.com
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Sy_zlNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gitlab.com/assets/favicon-72a2cad5025aa931d6ea56c3201d1f18e68a8cd39788c7c80d5b2b82aa5143ef.png" width="32" height="32"&gt;
        gitlab.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  OpenAPI Generator e APIs reativas
&lt;/h2&gt;

&lt;p&gt;O segundo módulo ministrado por Vinícius nos apresenta problemas que a solução está mais alinhada com assincronismo.&lt;/p&gt;

&lt;p&gt;Como estava seguindo a abordagem de &lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm"&gt;API First com OpenAPI Generator para endpoints REST&lt;/a&gt; fui procurar se existia alguma forma de se fazer isso com o plugin.&lt;/p&gt;

&lt;p&gt;Vi que a abordagem que estávamos utilizando era o Mutiny, e acabei caindo nessa issue que &lt;a href="https://github.com/tbredzin"&gt;tbredzin&lt;/a&gt; abriu um Pull Request:&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/OpenAPITools/openapi-generator/pull/10919"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Add support for asynchronous API for JavaJaxRsSpec
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#10919&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/tbredzin"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--DJKmpwJJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars.githubusercontent.com/u/20678048%3Fv%3D4" alt="tbredzin avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/tbredzin"&gt;tbredzin&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/OpenAPITools/openapi-generator/pull/10919"&gt;&lt;time&gt;Nov 21, 2021&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;resolves #4832
This PR is an attempt at addressing &lt;a href="https://github.com/OpenAPITools/openapi-generator/issues/4832"&gt;https://github.com/OpenAPITools/openapi-generator/issues/4832&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Since version 2.1, JAX-RS server side component has support for returning a &lt;code&gt;CompletionStage&lt;/code&gt; to mark the request as eligible for asynchronous processing. The advantage this approach has over the AsyncResponse based API is that it is richer and allows you to create asynchronous pipelines.&lt;/p&gt;
&lt;p&gt;It is also extended by 3rd party libraries such as &lt;a href="https://github.com/reactor/reactor-core"&gt;Reactor&lt;/a&gt;, &lt;a href="https://github.com/ReactiveX/RxJava"&gt;RxJava&lt;/a&gt; or &lt;a href="https://github.com/smallrye/smallrye-mutiny"&gt;Mutiny&lt;/a&gt;. All of those allow to convert from/to &lt;code&gt;CompletionStage&lt;/code&gt;, examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reactor:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-source-java js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-smi"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;&amp;gt; &lt;span class="pl-s1"&gt;single&lt;/span&gt; = &lt;span class="pl-s1"&gt;Mono&lt;/span&gt;.&lt;span class="pl-en"&gt;just&lt;/span&gt;(&lt;span class="pl-s"&gt;"something"&lt;/span&gt;).&lt;span class="pl-en"&gt;toFuture&lt;/span&gt;();
&lt;span class="pl-smi"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;&amp;gt;&amp;gt; &lt;span class="pl-s1"&gt;many&lt;/span&gt; = &lt;span class="pl-s1"&gt;Flux&lt;/span&gt;.&lt;span class="pl-en"&gt;just&lt;/span&gt;(&lt;span class="pl-s"&gt;"something"&lt;/span&gt;, &lt;span class="pl-s"&gt;"somethingelse"&lt;/span&gt;)
                .&lt;span class="pl-en"&gt;collectList&lt;/span&gt;()
                .&lt;span class="pl-en"&gt;toFuture&lt;/span&gt;()&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;RxJava3&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-source-java js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-smi"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;&amp;gt; &lt;span class="pl-s1"&gt;single&lt;/span&gt; = &lt;span class="pl-s1"&gt;Maybe&lt;/span&gt;.&lt;span class="pl-en"&gt;just&lt;/span&gt;(&lt;span class="pl-s"&gt;"something"&lt;/span&gt;).&lt;span class="pl-en"&gt;toCompletionStage&lt;/span&gt;();
&lt;span class="pl-smi"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;&amp;gt;&amp;gt; &lt;span class="pl-s1"&gt;many&lt;/span&gt; = &lt;span class="pl-s1"&gt;Flowable&lt;/span&gt;.&lt;span class="pl-en"&gt;fromArray&lt;/span&gt;(&lt;span class="pl-s"&gt;"something"&lt;/span&gt;, &lt;span class="pl-s"&gt;"somethingelse"&lt;/span&gt;)
                .&lt;span class="pl-en"&gt;toList&lt;/span&gt;()
                .&lt;span class="pl-en"&gt;toCompletionStage&lt;/span&gt;();&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Mutiny&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-source-java js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-smi"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;&amp;gt; &lt;span class="pl-s1"&gt;single&lt;/span&gt; = &lt;span class="pl-s1"&gt;Uni&lt;/span&gt;.&lt;span class="pl-en"&gt;createFrom&lt;/span&gt;().&lt;span class="pl-en"&gt;item&lt;/span&gt;(&lt;span class="pl-s"&gt;"something"&lt;/span&gt;).&lt;span class="pl-en"&gt;subscribeAsCompletionStage&lt;/span&gt;();
&lt;span class="pl-s1"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-s1"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="pl-s1"&gt;String&lt;/span&gt;&amp;gt; &lt;span class="pl-s1"&gt;many&lt;/span&gt; = &lt;span class="pl-s1"&gt;Multi&lt;/span&gt;.&lt;span class="pl-en"&gt;createFrom&lt;/span&gt;().&lt;span class="pl-en"&gt;items&lt;/span&gt;(&lt;span class="pl-s"&gt;"something"&lt;/span&gt;, &lt;span class="pl-s"&gt;"somethingelse"&lt;/span&gt;)
                .&lt;span class="pl-en"&gt;collect&lt;/span&gt;()
                .&lt;span class="pl-en"&gt;asList&lt;/span&gt;()
                .&lt;span class="pl-en"&gt;subscribeAsCompletionStage&lt;/span&gt;();&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Code changes&lt;/h2&gt;
&lt;p&gt;This PR adds the option &lt;code&gt;supportAsync&lt;/code&gt; to the Java JAX-RS spec generator and updates the mustache templates.&lt;/p&gt;
&lt;p&gt;When set to true, the generated API interfaces and classes will return &lt;code&gt;CompletionStage&lt;/code&gt; to support running asynchronous operation in JAX-RS (supported since JAX-RS 2.1).&lt;/p&gt;
&lt;p&gt;This option also enables java8 mode as &lt;code&gt;CompletionStage&lt;/code&gt; requires a JDK &amp;gt; 1.8&lt;/p&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Tests&lt;/h2&gt;
&lt;p&gt;Unit Tested for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generation with &lt;code&gt;interfaceOnly=true&lt;/code&gt; with the &lt;code&gt;petstore.yaml&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Generation with &lt;code&gt;interfaceOnly=true&lt;/code&gt; for complex types with the &lt;code&gt;ping.yaml&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Generation with &lt;code&gt;interfaceOnly=true&lt;/code&gt; for primitive types with the &lt;code&gt;issue_4832.yaml&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Generation with &lt;code&gt;interfaceOnly=true&lt;/code&gt; and &lt;code&gt;returnResponse=true&lt;/code&gt; with the &lt;code&gt;ping.yaml&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Generation with &lt;code&gt;interfaceOnly=false&lt;/code&gt; classes with &lt;code&gt;ping.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sample of generated API interfaces (&lt;code&gt;interfaceOnly=true&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight highlight-source-java js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;//PingApi.java w/  returnResponse=true&lt;/span&gt;
&lt;span class="pl-s1"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-s1"&gt;Response&lt;/span&gt;&amp;gt; &lt;span class="pl-en"&gt;pingGet&lt;/span&gt;();

&lt;span class="pl-c"&gt;// PetApi.java w/ returnResponse=false&lt;/span&gt;
&lt;span class="pl-s1"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-s1"&gt;Pet&lt;/span&gt;&amp;gt; &lt;span class="pl-en"&gt;getPetById&lt;/span&gt;(&lt;span class="pl-c1"&gt;@&lt;/span&gt;&lt;span class="pl-c1"&gt;PathParam&lt;/span&gt;(&lt;span class="pl-s"&gt;"petId"&lt;/span&gt;) &lt;span class="pl-c1"&gt;@&lt;/span&gt;&lt;span class="pl-c1"&gt;ApiParam&lt;/span&gt;(&lt;span class="pl-s"&gt;"ID of pet to return"&lt;/span&gt;) &lt;span class="pl-smi"&gt;Long&lt;/span&gt; &lt;span class="pl-s1"&gt;petId&lt;/span&gt;);
&lt;span class="pl-smi"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;Pet&lt;/span&gt;&amp;gt;&amp;gt; &lt;span class="pl-s1"&gt;findPetsByStatus&lt;/span&gt;(&lt;span class="pl-c1"&gt;@&lt;/span&gt;&lt;span class="pl-c1"&gt;QueryParam&lt;/span&gt;(&lt;span class="pl-s"&gt;"status"&lt;/span&gt;) &lt;span class="pl-c1"&gt;@&lt;/span&gt;&lt;span class="pl-c1"&gt;NotNull&lt;/span&gt;  &lt;span class="pl-c1"&gt;@&lt;/span&gt;&lt;span class="pl-c1"&gt;ApiParam&lt;/span&gt;(&lt;span class="pl-s"&gt;"Status values that need to be considered for filter"&lt;/span&gt;)  &lt;span class="pl-smi"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;&amp;gt; &lt;span class="pl-s1"&gt;status&lt;/span&gt;);

&lt;span class="pl-c"&gt;//FakeApi.java&lt;/span&gt;
&lt;span class="pl-smi"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;Boolean&lt;/span&gt;&amp;gt; &lt;span class="pl-s1"&gt;getBool&lt;/span&gt;(); &lt;span class="pl-c"&gt;//primitive type converted to class&lt;/span&gt;

&lt;span class="pl-c"&gt;// StoreApi.java&lt;/span&gt;
&lt;span class="pl-smi"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;Map&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;, &lt;span class="pl-smi"&gt;Integer&lt;/span&gt;&amp;gt;&amp;gt; &lt;span class="pl-s1"&gt;getInventory&lt;/span&gt;();
&lt;span class="pl-smi"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;Order&lt;/span&gt;&amp;gt; &lt;span class="pl-s1"&gt;placeOrder&lt;/span&gt;(&lt;span class="pl-c1"&gt;@&lt;/span&gt;&lt;span class="pl-c1"&gt;Valid&lt;/span&gt; &lt;span class="pl-c1"&gt;@&lt;/span&gt;&lt;span class="pl-c1"&gt;NotNull&lt;/span&gt; &lt;span class="pl-s1"&gt;Order&lt;/span&gt; &lt;span class="pl-smi"&gt;order&lt;/span&gt;);
&lt;span class="pl-s1"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-s1"&gt;Void&lt;/span&gt;&amp;gt; &lt;span class="pl-s1"&gt;deleteOrder&lt;/span&gt;(&lt;span class="pl-c1"&gt;@&lt;/span&gt;&lt;span class="pl-c1"&gt;PathParam&lt;/span&gt;(&lt;span class="pl-s"&gt;"orderId"&lt;/span&gt;) &lt;span class="pl-c1"&gt;@&lt;/span&gt;&lt;span class="pl-c1"&gt;ApiParam&lt;/span&gt;(&lt;span class="pl-s"&gt;"ID of the order that needs to be deleted"&lt;/span&gt;) &lt;span class="pl-smi"&gt;String&lt;/span&gt; &lt;span class="pl-s1"&gt;orderId&lt;/span&gt;);&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Sample of generated API class (&lt;code&gt;interfaceOnly=false&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight highlight-source-java js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;public&lt;/span&gt; &lt;span class="pl-smi"&gt;CompletionStage&lt;/span&gt;&amp;lt;&lt;span class="pl-smi"&gt;Response&lt;/span&gt;&amp;gt; &lt;span class="pl-s1"&gt;pingGet&lt;/span&gt;() {
    &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-s1"&gt;CompletableFuture&lt;/span&gt;.&lt;span class="pl-en"&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; &lt;span class="pl-s1"&gt;Response&lt;/span&gt;.&lt;span class="pl-en"&gt;ok&lt;/span&gt;().&lt;span class="pl-en"&gt;entity&lt;/span&gt;(&lt;span class="pl-s"&gt;"magic!"&lt;/span&gt;).&lt;span class="pl-en"&gt;build&lt;/span&gt;());
}&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Note that the current implementation from master, always returns &lt;code&gt;Response&lt;/code&gt;. So no specific types are returned with &lt;code&gt;supportAsync=true&lt;/code&gt; too: &lt;code&gt;CompletionStage&amp;lt;Response&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Project generated from it was compile successfully after running:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell js-code-highlight"&gt;
&lt;pre&gt;$ java -jar modules/openapi-generator-cli/target/openapi-generator-cli.jar generate \
-i https://raw.githubusercontent.com/OpenAPITools/openapi-generator/master/modules/openapi-generator/src/test/resources/3_0/petstore.yaml \
-g jaxrs-spec -p interfaceOnly=true,supportAsync=true -o &lt;span class="pl-k"&gt;~&lt;/span&gt;/tmp

$ &lt;span class="pl-c1"&gt;cd&lt;/span&gt; &lt;span class="pl-k"&gt;~&lt;/span&gt;/tmp 
$ mvn clean package&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;PR checklist&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[x] Read the &lt;a href="https://github.com/openapitools/openapi-generator/blob/master/CONTRIBUTING.md"&gt;contribution guidelines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[x] Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.&lt;/li&gt;
&lt;li&gt;[x] Run the following to &lt;a href="https://github.com/OpenAPITools/openapi-generator#14---build-projects"&gt;build the project&lt;/a&gt; and update samples:
&lt;pre&gt;&lt;code&gt;./mvnw clean package 
./bin/generate-samples.sh
./bin/utils/export_docs_generators.sh
&lt;/code&gt;&lt;/pre&gt;
Commit all changed files.
This is important, as CI jobs will verify &lt;em&gt;all&lt;/em&gt; generator outputs of your HEAD commit as it would merge with master.
These must match the expectations made by your contribution.
You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example &lt;code&gt;./bin/generate-samples.sh bin/configs/java*&lt;/code&gt;.
For Windows users, please run the script in &lt;a href="https://gitforwindows.org/" rel="nofollow"&gt;Git BASH&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[x] File the PR against the &lt;a href="https://github.com/OpenAPITools/openapi-generator/wiki/Git-Branches"&gt;correct branch&lt;/a&gt;: &lt;code&gt;master&lt;/code&gt; (5.3.0), &lt;code&gt;6.0.x&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[x] If your PR is targeting a particular programming language, @mention the &lt;a href="https://github.com/openapitools/openapi-generator/#62---openapi-generator-technical-committee"&gt;technical committee&lt;/a&gt; members, so they are more likely to review the pull request.
@nmuesch&lt;/li&gt;
&lt;/ul&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/OpenAPITools/openapi-generator/pull/10919"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Since version 2.1, JAX-RS server side component has support for returning a CompletionStage to mark the request as eligible for asynchronous processing. The advantage this approach has over the AsyncResponse based API is that it is richer and allows you to create asynchronous pipelines.&lt;/p&gt;

&lt;p&gt;It is also extended by 3rd party libraries such as Reactor, RxJava or Mutiny. All of those allow to convert from/to CompletionStage, examples:&lt;/p&gt;

&lt;p&gt;Reactor&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;single&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Mono&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;just&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"something"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toFuture&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;many&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flux&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;just&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"something"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"somethingelse"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collectList&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFuture&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;RxJava3&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;single&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Maybe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;just&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"something"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toCompletionStage&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;many&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flowable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromArray&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"something"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"somethingelse"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toCompletionStage&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Mutiny&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;single&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Uni&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createFrom&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"something"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;subscribeAsCompletionStage&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;many&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createFrom&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"something"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"somethingelse"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subscribeAsCompletionStage&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Pensei, porque não? Vamos ver no que isso vai dar...&lt;/p&gt;

&lt;p&gt;Podemos ver a configuração utilizando &lt;strong&gt;API-First&lt;/strong&gt; em nosso projeto nos arquivos &lt;strong&gt;applications/marketplace/build.gradle&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/openapigen_marketplace.gradle"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;E no arquivo &lt;strong&gt;plugins/openapigen_marketplace.gradle&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.openapitools.generator.gradle.plugin.tasks.GenerateTask&lt;/span&gt;

&lt;span class="n"&gt;buildscript&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;repositories&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mavenLocal&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;maven&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="s2"&gt;"https://repo1.maven.org/maven2"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;classpath&lt;/span&gt; &lt;span class="s2"&gt;"org.openapitools:openapi-generator-gradle-plugin:$openApiGenVersion"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s1"&gt;'org.openapi.generator'&lt;/span&gt;

&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;apiServerOutput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$buildDir/generated/openapi-code-server"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="nf"&gt;generatePratosApiServer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;GenerateTask&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;generatorName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"jaxrs-spec"&lt;/span&gt;
    &lt;span class="n"&gt;inputSpec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$projectDir/src/main/resources/openapi/pratos_v1.yml"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;outputDir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apiServerOutput&lt;/span&gt;
    &lt;span class="n"&gt;apiPackage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org.openapi.server.v1.pratos.api"&lt;/span&gt;
    &lt;span class="n"&gt;invokerPackage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org.openapi.v1.pratos.invoker"&lt;/span&gt;
    &lt;span class="n"&gt;modelPackage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org.openapi.v1.pratos.model"&lt;/span&gt;
    &lt;span class="n"&gt;configOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"dateLibrary"&lt;/span&gt;            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"java8"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"hideGenerationTimestamp"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"interfaceOnly"&lt;/span&gt;          &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"supportAsync"&lt;/span&gt;           &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"useOptional"&lt;/span&gt;            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"useBeanValidation"&lt;/span&gt;      &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"useSwaggerAnnotations"&lt;/span&gt;  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"false"&lt;/span&gt;
    &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="nf"&gt;generateRestaurantesApiServer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;GenerateTask&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;generatorName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"jaxrs-spec"&lt;/span&gt;
    &lt;span class="n"&gt;inputSpec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$projectDir/src/main/resources/openapi/restaurantes_v1.yml"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;outputDir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apiServerOutput&lt;/span&gt;
    &lt;span class="n"&gt;apiPackage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org.openapi.server.v1.restaurantes.api"&lt;/span&gt;
    &lt;span class="n"&gt;invokerPackage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org.openapi.v1.restaurantes.invoker"&lt;/span&gt;
    &lt;span class="n"&gt;modelPackage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org.openapi.v1.restaurantes.model"&lt;/span&gt;
    &lt;span class="n"&gt;configOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"dateLibrary"&lt;/span&gt;            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"java8"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"hideGenerationTimestamp"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"interfaceOnly"&lt;/span&gt;          &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"supportAsync"&lt;/span&gt;           &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"useOptional"&lt;/span&gt;            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"useBeanValidation"&lt;/span&gt;      &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"useSwaggerAnnotations"&lt;/span&gt;  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"false"&lt;/span&gt;
    &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;compileJava&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dependsOn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;generatePratosApiServer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generateRestaurantesApiServer&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sourceSets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;srcDir&lt;/span&gt; &lt;span class="s2"&gt;"$apiServerOutput/src/gen/java"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No &lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm"&gt;post anterior&lt;/a&gt; explicamos várias dessas configurações, o que ficou faltando foi só a &lt;strong&gt;supportAsync&lt;/strong&gt; que como o próprio nome já diz, habilita ou não o suporte a APIs assíncronas.&lt;/p&gt;

&lt;p&gt;Nesse projeto também optei por criar 2 APIs para a geração, uma para pratos (&lt;strong&gt;"$projectDir/src/main/resources/openapi/pratos_v1.yml".toString()&lt;/strong&gt;) e outra para restaurantes (&lt;strong&gt;"$projectDir/src/main/resources/openapi/restaurantes_v1.yml".toString()&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Quando executamos a fase &lt;strong&gt;compileJava&lt;/strong&gt; ou tasks que dependem dela podemos ver que a seguinte estrutura foi criada em &lt;strong&gt;applications/marketplace/build&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t8fTYTxd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hwwkt0b7trdphxe3e253.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t8fTYTxd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hwwkt0b7trdphxe3e253.png" alt="Generated source" width="880" height="841"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Analisando as classes geradas, temos &lt;strong&gt;PratoAPI&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;org.openapi.server.v1.pratos.api&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.openapi.v1.pratos.model.Prato&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.core.Response&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletionStage&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.InputStream&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Map&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/pratos"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@javax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Generated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;PratosApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@GET&lt;/span&gt;
    &lt;span class="nd"&gt;@Produces&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;E &lt;strong&gt;RestaurantesAPI&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;org.openapi.server.v1.restaurantes.api&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.openapi.v1.restaurantes.model.Prato&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.core.Response&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletionStage&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.InputStream&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Map&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;


&lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/restaurantes/{idRestaurante}/pratos"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@javax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Generated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;RestaurantesApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@GET&lt;/span&gt;
    &lt;span class="nd"&gt;@Produces&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;E seguindo com a nossa configuração, precisamos implementar um classe concreta para definir como o método vai funcionar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;applications/marketplace/src/main/java/com/gitlab/arthurfnsc/ifood/marketplace/PratoResource&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.gitlab.arthurfnsc.ifood.marketplace&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.smallrye.mutiny.Multi&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletionStage&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.Consumes&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.Path&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.Produces&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.core.MediaType&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.openapi.server.v1.pratos.api.PratosApi&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.openapi.v1.pratos.model.Prato&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/pratos"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@Produces&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_JSON&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@Consumes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_JSON&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PratoResource&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;PratosApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pratos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;arthurfnsc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ifood&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;marketplace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;recuperaPratosApi&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pratos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;subscribeAsCompletionStage&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;applications/marketplace/src/main/java/com/gitlab/arthurfnsc/ifood/marketplace/RestauranteResource&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.gitlab.arthurfnsc.ifood.marketplace&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.smallrye.mutiny.Multi&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.concurrent.CompletionStage&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.Consumes&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.Path&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.Produces&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.core.MediaType&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.openapi.server.v1.restaurantes.api.RestaurantesApi&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/restaurantes"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@Produces&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_JSON&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@Consumes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_JSON&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RestauranteResource&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;RestaurantesApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;restaurantes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;restaurantes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pratos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;arthurfnsc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ifood&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;marketplace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;recuperaPratosApi&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;idRestaurante&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pratos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;subscribeAsCompletionStage&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Na classe &lt;strong&gt;Prato&lt;/strong&gt;, no mesmo pacote do nosso resource implementamos os seguintes métodos:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.gitlab.arthurfnsc.ifood.marketplace&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Prato&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PanacheEntityBase&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pratos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosApi&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onItem&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;PratoMapper:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;paraPratoApi&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;restaurantes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosApi&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"restaurante.id"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onItem&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;PratoMapper:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;paraPratoRestauranteApi&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Essa minha abordagem de ter 2 &lt;strong&gt;OpenAPIs&lt;/strong&gt; gerou um problema que pode ser percebido no código acima. Vocês podem percebem que acabaram sendo geradas 2 classes &lt;strong&gt;Prato&lt;/strong&gt;, uma em &lt;strong&gt;org.openapi.v1.pratos.model.Prato&lt;/strong&gt; e outra em &lt;strong&gt;org.openapi.v1.restaurantes.model.Prato&lt;/strong&gt; o que me deixou 2 métodos muito parecidos, com uma diferença do método de transformação chamado.&lt;/p&gt;

&lt;p&gt;No caso da solução do Vinícius as &lt;a href="https://github.com/viniciusfcf/udemy-quarkus/tree/master/marketplace/src/main/java/com/github/viniciusfcf/ifood/mp"&gt;Resources dele&lt;/a&gt; retornam &lt;strong&gt;Multi&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.github.viniciusfcf.ifood.mp&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.smallrye.mutiny.Multi&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PratoResource&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Inject&lt;/span&gt;
    &lt;span class="nc"&gt;PgPool&lt;/span&gt; &lt;span class="n"&gt;pgPool&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@GET&lt;/span&gt;
    &lt;span class="nd"&gt;@APIResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;responseCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"200"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;@Content&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;@Schema&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SchemaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ARRAY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PratoDTO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;PratoDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;buscarPratos&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pgPool&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.github.viniciusfcf.ifood.mp&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.smallrye.mutiny.Multi&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RestauranteResource&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Inject&lt;/span&gt;
    &lt;span class="nc"&gt;PgPool&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@GET&lt;/span&gt;
    &lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{idRestaurante}/pratos"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;PratoDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;buscarPratos&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Como estamos trabalhando com &lt;strong&gt;CompletionStage&lt;/strong&gt; ao invés de &lt;strong&gt;Multi&lt;/strong&gt;, vamos ver se aquela dica do &lt;a href="https://github.com/tbredzin"&gt;tbredzin&lt;/a&gt; funciona:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PratoResource&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pratos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;arthurfnsc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ifood&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;marketplace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;recuperaPratosApi&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pratos&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subscribeAsCompletionStage&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;RestauranteResource&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletionStage&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;restaurantes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;restaurantes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pratos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;arthurfnsc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ifood&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;marketplace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;recuperaPratosApi&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;idRestaurante&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pratos&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subscribeAsCompletionStage&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://giphy.com/gifs/manutd-ronaldo-mufc-crisitano-HMpcgxAZs5YYHsbe8P" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--WUAVidJb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media2.giphy.com/media/HMpcgxAZs5YYHsbe8P/giphy.gif%3Fcid%3D790b7611fdfcbc8d419f031e86520be16f9966f0cc14b27f%26rid%3Dgiphy.gif%26ct%3Dg" height="480" class="m-0" width="480"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://giphy.com/gifs/manutd-ronaldo-mufc-crisitano-HMpcgxAZs5YYHsbe8P" rel="noopener noreferrer" class="c-link"&gt;
          Happy Celebration GIF by Manchester United - Find &amp;amp; Share on GIPHY
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Discover &amp;amp; share this Manchester United GIF with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--EnkhlOxW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://giphy.com/static/img/favicon.png" width="16" height="16"&gt;
        giphy.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Você pode ter percebido que não interagimos com o &lt;strong&gt;PgPool&lt;/strong&gt; como o Vinícius. Isso se deve ao fato de conseguirmos usar o hibernate em uma solução reativa, o que ainda estava em fase beta quando o Vinícius fez o curso dele. Falaremos mais sobre o &lt;strong&gt;quarkus-hibernate-reactive-panache&lt;/strong&gt; adiante.&lt;/p&gt;




&lt;h2&gt;
  
  
  Considerações finais
&lt;/h2&gt;

&lt;p&gt;Quando estava fazendo essa abordagem fiquei com dúvida se essa era uma boa implementação. Afinal, qual a diferença entre um &lt;strong&gt;Multi&lt;/strong&gt; ou &lt;strong&gt;Uni&lt;/strong&gt; e um &lt;strong&gt;CompletionStage&lt;/strong&gt;? O seguinte link me ajudou um pouco a entender que eles não são a mesma coisa:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://smallrye.io/smallrye-mutiny/1.7.0/guides/completion-stage/" rel="noopener noreferrer"&gt;
      smallrye.io
    &lt;/a&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;While CompletionStage and CompletableFuture are close to Uni in terms of use case, there are some fundamental differences.&lt;/p&gt;

&lt;p&gt;CompletionStage are eager. When a method returns a CompletionStage, the operation has already been triggered. The outcome is used to complete the returned CompletionStage. On the other side, Unis are lazy. The operation is only triggered once there is a subscription.&lt;/p&gt;

&lt;p&gt;CompletionStage caches the outcome. So, once received, you can retrieve the result. Every retrieval will get the same result. With Uni, every subscription has the opportunity to re-trigger the operation and gets a different result.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Segue também um outro link bem interessante:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://smallrye.io/smallrye-mutiny/1.7.0/tutorials/transforming-items-asynchronously/" rel="noopener noreferrer"&gt;
      smallrye.io
    &lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Sobre a utilização de OpenAPI Gen para APIs reativas
&lt;/h3&gt;

&lt;p&gt;Bem, essa foi a primeira implementação que fiz, e portanto não consegui abstrair maiores problemas. Como não estressei a solução em vários projetos, não seria algo que eu colocaria em produção em um cliente. Ao meu modo de ver, é importante validar outros cenários mais complexos.&lt;/p&gt;

&lt;p&gt;Mas achei bem interessante essa possibilidade do plugin.&lt;/p&gt;

&lt;p&gt;No próximo post falaremos sobre uma solução da &lt;strong&gt;OWASP&lt;/strong&gt; para validação de vulnerabilidade em nossas bibliotecas.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse post faz parte de uma série sobre &lt;strong&gt;Cursos que formaram meu caráter: Desenvolvimento web com Quarkus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A série completa é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-talk-is-cheap-show-me-the-code-2k91"&gt;Talk is cheap show me the code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn"&gt;Utilizando Gradle ao invés de Maven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na"&gt;Plugins do Gradle: Gerenciador de versões de bibliotecas com Versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-saudades-do-maven-relatorios-com-project-report-51d6"&gt;Plugins do Gradle: Saudades do  Maven, relatórios com Project-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm"&gt;Plugins do Gradle: API First com o OpenAPI Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: API First com o OpenAPI Generator para APIs reativas&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-validacao-de-vulnerabilidades-com-owasp-dependency-check-2a2l"&gt;Plugins do Gradle: Validação de vulnerabilidades de dependências com OWASP Dependency Check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: Lint com Spotless [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Motivação para a escolha [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Considerações sobre o Prettier em pipelines [não publicado]&lt;/li&gt;
&lt;li&gt;Gitmoji [não publicado]&lt;/li&gt;
&lt;li&gt;SDK Man [não publicado]&lt;/li&gt;
&lt;li&gt;Pré commit hook [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando YML em propriedades de aplicação [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando variáveis de ambiente [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Sobrescrevendo opções em teste [não publicado]&lt;/li&gt;
&lt;li&gt;Mapstruct: Utilizando expressões para mapeamentos [não publicado]&lt;/li&gt;
&lt;li&gt;Microprofile SecurityScheme: Sobrescrevendo tokenUrl [não publicado]&lt;/li&gt;
&lt;li&gt;Prometheus: O problema simples que me custou algumas horas [não publicado]&lt;/li&gt;
&lt;li&gt;quarkus-hibernate-reactive-panache: Utilizando as vantagens do Hibernate em projetos reativos [não publicado]&lt;/li&gt;
&lt;li&gt;Testcontainers: Configuração para projetos reativos [não publicado]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gradle</category>
      <category>openapi</category>
      <category>quarkus</category>
      <category>async</category>
    </item>
    <item>
      <title>Cursos que formaram meu caráter: Desenvolvimento web com Quarkus - API First com o OpenAPI Generator</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Thu, 15 Dec 2022 04:53:30 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm</link>
      <guid>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"Imaginação é o começo da criação. Você imagina o que deseja, deseja o que imagina e, por fim, cria o que deseja". George Bernard Shaw&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Neste quinto post falaremos sobre um tema que estudo desde 2012 quando tive uma grande experiência com &lt;strong&gt;SOA (Service Oriented Architecture)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Falaremos sobre pontos positivos e negativos da abordagem, uma vez que tudo tem trade-offs.&lt;/p&gt;

&lt;p&gt;Para trabalhar com &lt;a href="https://quarkus.io/" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt; vamos precisar usar o &lt;strong&gt;JAX-RS&lt;/strong&gt; como ponte para geração de nossos contratos. Como grande fã do &lt;a href="https://spring.io/" rel="noopener noreferrer"&gt;Spring&lt;/a&gt; vamos entrar em algumas discussões sobre estar ou não atrelado à especificação do &lt;strong&gt;Java&lt;/strong&gt;. Vamos então comparar vantagens e desvantagens de se utilizar o &lt;strong&gt;JAX-RS&lt;/strong&gt; ou abstrações &lt;strong&gt;Spring&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://giphy.com/gifs/latenightseth-seth-meyers-l0Iy00xfeHKouH65G" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExeTdxejNzZng4OWU3ZjN6aTk2OTY1eWtta3FuM3k3YmhxMXJmbXZleCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2Fl0Iy00xfeHKouH65G%2Fgiphy.webp" height="500" class="m-0" width="500"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://giphy.com/gifs/latenightseth-seth-meyers-l0Iy00xfeHKouH65G" rel="noopener noreferrer" class="c-link"&gt;
          Seth Meyers GIF by Late Night with Seth Meyers - Find &amp;amp; Share on GIPHY
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Discover &amp;amp; share this Seth Meyers GIF by Late Night with Seth Meyers with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiphy.com%2Fstatic%2Fimg%2Ffavicon.png" width="16" height="16"&gt;
        giphy.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Prefiro a solução com &lt;strong&gt;Spring&lt;/strong&gt;. E irei explicar o porque.&lt;/p&gt;

&lt;p&gt;Esse artigo faz parte de uma série, abaixo é possível encontrar a lista completa de artigos.&lt;/p&gt;

&lt;p&gt;Estamos nos baseando no curso &lt;a href="https://www.udemy.com/course/des-web-quarkus" rel="noopener noreferrer"&gt;Desenvolvimento web com Quarkus&lt;/a&gt; do &lt;a class="mentioned-user" href="https://dev.to/viniciusfcf"&gt;@viniciusfcf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O repositório que estamos utilizando é:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgitlab.com%2Fassets%2Ftwitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" height="800" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" rel="noopener noreferrer" class="c-link"&gt;
          udemy / Desenvolvimento Web com Quarkus / ifood · GitLab
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          GitLab.com
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgitlab.com%2Fassets%2Ffavicon-72a2cad5025aa931d6ea56c3201d1f18e68a8cd39788c7c80d5b2b82aa5143ef.png" width="32" height="32"&gt;
        gitlab.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  SOA so far
&lt;/h2&gt;

&lt;p&gt;Caso você tenha interesse em outros posts sobre &lt;strong&gt;SOA&lt;/strong&gt;, escrevi alguns insights que podem ser úteis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@arthurfnsc/desacoplamento-em-apis-com-api-first-1c9eac93e41e" rel="noopener noreferrer"&gt;Desacoplamento em APIs com API First&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@arthurfnsc/fundamentos-objetivos-e-benef%C3%ADcios-estrat%C3%A9gicos-de-soa-parte-1-19fe0f229f51" rel="noopener noreferrer"&gt;Fundamentos, Objetivos e Benefícios estratégicos de SOA (parte 1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@arthurfnsc/fundamentos-objetivos-e-benef%C3%ADcios-estrat%C3%A9gicos-de-soa-parte-2-1b630419a2d1" rel="noopener noreferrer"&gt;Fundamentos, Objetivos e Benefícios estratégicos de SOA (parte 2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@arthurfnsc/princ%C3%ADpios-soa-57d0c34d9f0f" rel="noopener noreferrer"&gt;Princípios SOA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@arthurfnsc/n%C3%A3o-confunda-alhos-com-bugalhos-soa-e-soap-359ca3f32813" rel="noopener noreferrer"&gt;Não confunda alhos com bugalhos: SOA e SOAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arthurfnsc.medium.com/contract-first-em-rest-com-swagger-859ff0567a1" rel="noopener noreferrer"&gt;Contract-First em REST com Swagger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arthurfnsc.medium.com/contract-first-em-rest-aba428f0eff1" rel="noopener noreferrer"&gt;Contract-First em REST&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em 2012 entrei em um instituto de pesquisas, o &lt;a href="https://www.ibti.org.br/" rel="noopener noreferrer"&gt;IBTI&lt;/a&gt;. Um instituto que foi bem importante para as minhas concepções arquiteturais.&lt;/p&gt;

&lt;p&gt;Entrei em um laboratório de &lt;strong&gt;SOA&lt;/strong&gt; e me lembro de pensar que se tratava de um plugin do Java na época.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SOA&lt;/strong&gt; me influenciou tanto que um de seus princípios, a &lt;a href="https://patterns.arcitura.com/soa-patterns/basics/serviceorientation/standardized_service_contract" rel="noopener noreferrer"&gt;Padronização de contrato de serviços&lt;/a&gt; acabou me atrasando a entrar no mundo &lt;strong&gt;REST&lt;/strong&gt;. Para mim, se eu não utilizasse &lt;strong&gt;Contract-First&lt;/strong&gt; não estava bom.&lt;/p&gt;

&lt;p&gt;Me lembro inclusive de um projeto que escrevi uma vez, que eu tinha definido um projeto multi módulo em que um módulo trabalhava com &lt;strong&gt;REST&lt;/strong&gt; e esse chamava outro módulo que trabalhava com &lt;strong&gt;SOAP&lt;/strong&gt; só porque eu utilizava &lt;strong&gt;Contract First&lt;/strong&gt; lá.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzz7cjpvswb7nxih3jw2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzz7cjpvswb7nxih3jw2.png" alt="Face palm" width="265" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fico pensando hoje no overhead dessa decisão arquitetural.&lt;/p&gt;

&lt;p&gt;São coisas que olho para trás e apesar de não concordar hoje, sei que me ajudaram a chegar aonde estou hoje.&lt;/p&gt;

&lt;p&gt;Como dito anteriormente, em um instituto de pesquisas o que é necessário fazer é experimentar novas coisas. E experimentar quer dizer provar coisas que você não sabe se estão certas ou não.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenAPI abordagens
&lt;/h2&gt;

&lt;p&gt;Partirei do pré-suposto que você já ouviu falar sobre &lt;a href="https://www.openapis.org/" rel="noopener noreferrer"&gt;OpenAPI&lt;/a&gt; ou &lt;a href="https://swagger.io/" rel="noopener noreferrer"&gt;Swagger&lt;/a&gt; daqui para frente.&lt;/p&gt;

&lt;p&gt;Como abordagens de APIs com &lt;strong&gt;Swagger&lt;/strong&gt; ou &lt;strong&gt;OpenAPI&lt;/strong&gt; podemos dividir em 3 abordagens:&lt;/p&gt;

&lt;h3&gt;
  
  
  Escrita de contrato e implementação em uma linguagem de programação
&lt;/h3&gt;

&lt;p&gt;Nesse abordagem é definido um contrato e a equipe de desenvolvimento segue a especificação em seu código de uma forma de-para.&lt;/p&gt;

&lt;h3&gt;
  
  
  Geração de contrato a partir de código
&lt;/h3&gt;

&lt;p&gt;Nessa abordagem iniciamos por nosso código para gerar o nosso contrato.&lt;/p&gt;

&lt;h3&gt;
  
  
  Geração de código a partir de contrato
&lt;/h3&gt;

&lt;p&gt;Nessa abordagem iniciamos por nosso contrato para a geração de um código. Essa abordagem é conhecida como &lt;strong&gt;Contract-First&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prós e contra de cada abordagem
&lt;/h2&gt;

&lt;p&gt;Na primeira abordagem o principal problema que possuímos é o fato de a implementação ser manual, sendo assim, o programador pode se confundir ou esquecer de algo da especificação.&lt;/p&gt;

&lt;p&gt;Na segunda abordagem o principal problema no caso do &lt;strong&gt;Java&lt;/strong&gt; são questões com a serialização e desserialização de classes que especificamos. Podemos utilizar classes que não implementam serialização para gerar nosso &lt;strong&gt;Swagger&lt;/strong&gt; ou &lt;strong&gt;OpenAPI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ainda na segunda abordagem, a vantagem está em não estarmos atrelados a outras soluções e utilizar implementações que a maioria da comunidade utiliza.&lt;/p&gt;

&lt;p&gt;Na terceira abordagem o principal problema é estar atrelado a alguma solução, que pode não ter todas as funcionalidades que precisamos.&lt;/p&gt;

&lt;p&gt;Ainda na terceira abordagem, a vantagem é estarmos sempre alinhados a um contrato especificado, evitando a quebra o mesmo.&lt;/p&gt;

&lt;p&gt;Nesse post iremos utilizar a terceira abordagem, mesmo tendo o problema de estar atrelado a uma solução de geração de código.&lt;/p&gt;

&lt;p&gt;Já escrevi sobre o &lt;a href="https://github.com/OpenAPITools/openapi-generator" rel="noopener noreferrer"&gt;OpenAPI Generator&lt;/a&gt;, porém, precisei fazer alguns ajustes para trabalhar com isso no &lt;strong&gt;Quarkus&lt;/strong&gt; e é sobre isso que vamos iniciar agora.&lt;/p&gt;

&lt;p&gt;Mais à frente falaremos sobre outros problemas dessa abordagem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Principais configuração em nosso projeto
&lt;/h2&gt;

&lt;p&gt;Podemos ver a configuração utilizando &lt;strong&gt;API-First&lt;/strong&gt; em nosso projeto nos arquivos &lt;strong&gt;applications/cadastro/build.gradle&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/openapigen_cadastro.gradle"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;E no arquivo &lt;strong&gt;plugins/openapigen_cadastro.gradle&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.openapitools.generator.gradle.plugin.tasks.GenerateTask&lt;/span&gt;

&lt;span class="n"&gt;buildscript&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;repositories&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mavenLocal&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;maven&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="s2"&gt;"https://repo1.maven.org/maven2"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;classpath&lt;/span&gt; &lt;span class="s2"&gt;"org.openapitools:openapi-generator-gradle-plugin:$openApiGenVersion"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s1"&gt;'org.openapi.generator'&lt;/span&gt;

&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;apiServerOutput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$buildDir/generated/openapi-code-server"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="nf"&gt;generateApiServer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;GenerateTask&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;generatorName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"jaxrs-spec"&lt;/span&gt;
    &lt;span class="n"&gt;inputSpec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$projectDir/src/main/resources/openapi/restaurantes_v1.yml"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;outputDir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apiServerOutput&lt;/span&gt;
    &lt;span class="n"&gt;apiPackage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org.openapi.server.v1.restaurantes.api"&lt;/span&gt;
    &lt;span class="n"&gt;invokerPackage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org.openapi.v1.restaurantes.invoker"&lt;/span&gt;
    &lt;span class="n"&gt;modelPackage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org.openapi.v1.restaurantes.model"&lt;/span&gt;
    &lt;span class="n"&gt;configOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"dateLibrary"&lt;/span&gt;            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"java8"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"hideGenerationTimestamp"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"interfaceOnly"&lt;/span&gt;          &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"performBeanValidation"&lt;/span&gt;  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"returnResponse"&lt;/span&gt;         &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"serializableModel"&lt;/span&gt;      &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"useBeanValidation"&lt;/span&gt;      &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"useOptional"&lt;/span&gt;            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"useSwaggerAnnotations"&lt;/span&gt;  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"false"&lt;/span&gt;
    &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;compileJava&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dependsOn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;generateApiServer&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sourceSets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;srcDir&lt;/span&gt; &lt;span class="s2"&gt;"$apiServerOutput/src/gen/java"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Na configuração &lt;strong&gt;apiServerOutput&lt;/strong&gt; definimos um destino para no qual serão criadas nossas classes com base em nossa &lt;strong&gt;OpenAPI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Na configuração do plugin definimos que utilizaremos o &lt;strong&gt;JAX-RS&lt;/strong&gt; como especificação de nossa API. Lembrando que existem &lt;a href="https://openapi-generator.tech/docs/generators/" rel="noopener noreferrer"&gt;outras abordagens&lt;/a&gt; para o &lt;strong&gt;generatorName&lt;/strong&gt; tanto para &lt;strong&gt;server&lt;/strong&gt; quanto para &lt;strong&gt;client&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Na configuração &lt;strong&gt;inputSpec&lt;/strong&gt; utilizamos o caminho para nossa &lt;strong&gt;OpenAPI&lt;/strong&gt; no projeto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;apiPackage&lt;/strong&gt;, &lt;strong&gt;invokerPackage&lt;/strong&gt; e &lt;strong&gt;modelPackage&lt;/strong&gt; são as configurações de nossos packages da aplicação que será gerada:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftiuhrwu3rpp8c9lmsk0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftiuhrwu3rpp8c9lmsk0u.png" alt="Package configurations" width="800" height="744"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sobre as configurações utilizadas em &lt;strong&gt;configOptions do jaxrs-spec&lt;/strong&gt; podemos encontrar mais detalhes no &lt;a href="https://openapi-generator.tech/docs/generators/jaxrs-spec/" rel="noopener noreferrer"&gt;seguinte link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Definimos então as bibliotecas do &lt;strong&gt;java8&lt;/strong&gt; para configuração de nossas bibliotecas de data. Não se confunda com o fato de o &lt;strong&gt;Java&lt;/strong&gt; possuir outras versões para além do 8! Para o plugin isso se refere ao fato de usarmos &lt;strong&gt;LocalDate&lt;/strong&gt;, classe que apareceu a partir do &lt;strong&gt;Java 8&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;hideGenerationTimestamp&lt;/strong&gt; diz respeito à geração do timestamp de geração estar na interface gerada. Como estamos gerando nossas classes no package &lt;strong&gt;build&lt;/strong&gt; essa é uma configuração que não impacta muito na forma como usamos o plugin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;interfaceOnly&lt;/strong&gt; diz respeito à geração de interfaces para serem implementadas.&lt;/p&gt;

&lt;p&gt;Para nossa abordagem não precisaremos de classes concretas, porque iremos implementar a interface, mas para entender o que mudaria no caso desse parâmetro ser false, pense nos projetos gerados a partir do site &lt;a href="https://editor.swagger.io/" rel="noopener noreferrer"&gt;https://editor.swagger.io/&lt;/a&gt; &amp;gt; Generate Server &amp;gt; jaxrs-spec. Nesse caso será criado uma classe concreta para ser evoluída.&lt;/p&gt;

&lt;p&gt;Para entender nossa abordagem, estamos gerando uma interface &lt;strong&gt;Java&lt;/strong&gt; com base em um contrato &lt;strong&gt;OpenAPI&lt;/strong&gt;, essas classes geradas não precisarão ser versionadas, pois podem ser criadas e recriadas dado evolução da nossa API. O que buscamos é ter a certeza que estamos implementando todos os métodos da interface, e caso mudemos nossa &lt;strong&gt;OpenAPI&lt;/strong&gt; perceber que precisamos estar em compliance com o contrato descrito.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokfkvch7frkcrrl2vmom.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokfkvch7frkcrrl2vmom.png" alt="Generate Server" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A configuração &lt;strong&gt;performBeanValidation&lt;/strong&gt; e &lt;strong&gt;useBeanValidation&lt;/strong&gt; dizem respeito a utilizar o &lt;strong&gt;Bean Validation&lt;/strong&gt; ou não nas classes geradas, bem como realizar sua validação em camada de &lt;strong&gt;Controller&lt;/strong&gt;. Isso inclusive diz respeito a uma diferença da abordagem do &lt;a class="mentioned-user" href="https://dev.to/viniciusfcf"&gt;@viniciusfcf&lt;/a&gt;. Estamos delegando ao plugin essa validação, porém isso nos trás um problema, não estamos mais controlando o Validation das nossas classes, e com isso estamos atrelados aos lados bons e ruins do plugin. Na solução utilizada pelo Vinícius, ele conseguia ajustar coisas em seus &lt;strong&gt;DTOs&lt;/strong&gt;, no nosso caso estamos delegando isso às classes de modelo geradas pelo plugin. Existem até formas de sobrescrevermos como o plugin gera as classes com o &lt;a href="https://mustache.github.io/" rel="noopener noreferrer"&gt;Mustache&lt;/a&gt;, mas para fins desse post não pensei em criar configurações próprias, preferi utilizar a geradas pelo próprio plugin.&lt;/p&gt;

&lt;p&gt;A configuração &lt;strong&gt;returnResponse&lt;/strong&gt; é uma das principais reclamações que tenho com relação ao &lt;strong&gt;JAX-RS&lt;/strong&gt;. Caso essa solução seja definida como false os métodos gerados terão em sua assinatura as classes da especificação e não a classe &lt;strong&gt;javax.ws.rs.core.Response&lt;/strong&gt;. As vantagens do &lt;strong&gt;returnResponse&lt;/strong&gt; false é a geração de métodos como:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/restaurantes"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@javax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Generated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;RestaurantesApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="nd"&gt;@POST&lt;/span&gt;
    &lt;span class="nd"&gt;@Consumes&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;cadastraRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Valid&lt;/span&gt; &lt;span class="nc"&gt;CadastroRestaurante&lt;/span&gt; &lt;span class="n"&gt;cadastroRestaurante&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nd"&gt;@GET&lt;/span&gt;
    &lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{idRestaurante}/pratos"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@Produces&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Os primeiros "problemas" com OpenAPI e JAX-RS
&lt;/h3&gt;

&lt;p&gt;A desvantagem inicial que vi foi no retorno de &lt;strong&gt;HTTP Status&lt;/strong&gt; para &lt;strong&gt;201 Created&lt;/strong&gt;, pois no caso de métodos de retorno void eu não consegui alterar o &lt;strong&gt;HTTP Status&lt;/strong&gt;, o retorno era sempre &lt;strong&gt;200 Ok&lt;/strong&gt;. Até vi uma outra abordagem, mas para isso, porém, eu precisaria ajustar a forma como o gerador de código funciona com o &lt;a href="https://mustache.github.io/" rel="noopener noreferrer"&gt;Mustache&lt;/a&gt; para a adição do parâmetro &lt;strong&gt;HttpServletResponse response&lt;/strong&gt; nos métodos gerados como mostrado por &lt;a href="https://stackoverflow.com/users/315677/pierre-henry" rel="noopener noreferrer"&gt;Pierre Henry&lt;/a&gt; nessa dúvida do Stack Overflow.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@POST&lt;/span&gt;
&lt;span class="nd"&gt;@Consumes&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_JSON&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="nd"&gt;@Produces&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_JSON&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nf"&gt;addUser&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;@Context&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;HttpServletResponse&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;

    &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;newUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;

    &lt;span class="c1"&gt;//set HTTP code to "201 Created"&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setStatus&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpServletResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SC_CREATED&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flushBuffer&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;){}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;newUser&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;div class="ltag__stackexchange--header"&gt;
          &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackoverflow-logo-b42691ae545e4810b105ee957979a853a696085e67e43ee14c5699cf3e890fb4.svg" alt=""&gt;
          &lt;a href="https://stackoverflow.com/questions/4687271/jax-rs-how-to-return-json-and-http-status-code-together" rel="noopener noreferrer"&gt;
            JAX-RS — How to return JSON and HTTP status code together?
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;Jan 14 '11&lt;/span&gt;
            &lt;span&gt;Comments: 3&lt;/span&gt;
            &lt;span&gt;Answers: 14&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://stackoverflow.com/questions/4687271/jax-rs-how-to-return-json-and-http-status-code-together" rel="noopener noreferrer"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          287
        &lt;/div&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;I'm writing a REST web app (NetBeans 6.9, JAX-RS, TopLink Essentials) and trying to return JSON &lt;strong&gt;and&lt;/strong&gt; HTTP status code. I have code ready and working that returns JSON when the HTTP GET method is called from the client. Essentially:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@Path("get/id")
@GET
@Produces("application/json")
public M_機械 getMachineToUpdate(@PathParam("id") String id) {

    //&lt;/code&gt;&lt;/pre&gt;…
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    &lt;a href="https://stackoverflow.com/questions/4687271/jax-rs-how-to-return-json-and-http-status-code-together" class="ltag__stackexchange--btn" rel="noopener noreferrer"&gt;Open Full Question&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Por outro lado, utilizar a opção &lt;strong&gt;returnResponse&lt;/strong&gt; como true o retorno é a classe &lt;strong&gt;javax.ws.rs.core.Response&lt;/strong&gt;, o problema é que diferente da solução do &lt;strong&gt;Spring&lt;/strong&gt; o &lt;strong&gt;Response&lt;/strong&gt; do &lt;strong&gt;JAX-RS&lt;/strong&gt; não utiliza generics. Observe a diferença do &lt;strong&gt;JAX-RS&lt;/strong&gt; e do &lt;strong&gt;Spring&lt;/strong&gt; para o mesmo problema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.core.Response&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;RestaurantesApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@PUT&lt;/span&gt;
    &lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{idRestaurante}/pratos/{idPrato}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@Consumes&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="nc"&gt;Response&lt;/span&gt; &lt;span class="nf"&gt;atualizaPratoRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nd"&gt;@PathParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idPrato"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idPrato&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@PathParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Valid&lt;/span&gt; &lt;span class="nc"&gt;AtualizacaoPrato&lt;/span&gt; &lt;span class="n"&gt;atualizacaoPrato&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nd"&gt;@GET&lt;/span&gt;
    &lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{idRestaurante}/pratos"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@Produces&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="nc"&gt;Response&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.http.ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;RestaurantesApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;atualizaPratoRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nd"&gt;@Parameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"idPrato"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idPrato"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idPrato&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Parameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Parameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"AtualizacaoPrato"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nd"&gt;@Valid&lt;/span&gt; &lt;span class="nd"&gt;@RequestBody&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;AtualizacaoPrato&lt;/span&gt; &lt;span class="n"&gt;atualizacaoPrato&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOT_IMPLEMENTED&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nd"&gt;@Parameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;getRequest&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;ifPresent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaType&lt;/span&gt; &lt;span class="nl"&gt;mediaType:&lt;/span&gt; &lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseMediaTypes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getHeader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Accept"&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isCompatibleWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;exampleString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"{ \"preco\" : 6.027456183070403, \"nome\" : \"nome\", \"id\" : 0, \"descricao\" : \"descricao\" }"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="nc"&gt;ApiUtil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setExampleResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exampleString&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOT_IMPLEMENTED&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Observe que &lt;strong&gt;ResponseEntity&lt;/strong&gt; do &lt;strong&gt;Spring&lt;/strong&gt; utiliza generics e &lt;strong&gt;Response&lt;/strong&gt; do &lt;strong&gt;JAX-RS&lt;/strong&gt; não. Com isso, acho a solução do Spring para o problema muito mais elegante, pois garanto o tipo de entidade do retorno, diferente da opção &lt;strong&gt;Response&lt;/strong&gt; em que poderíamos alterar o objeto de retorno sem que houvesse um erro de compilação.&lt;/p&gt;

&lt;p&gt;O código utilizado como referência se encontra em &lt;strong&gt;applications/cadastro/src/main/java/com/gitlab/arthurfnsc/ifood/cadastro/RestauranteResource&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="nd"&gt;@Counted&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Quantidade buscas restaurante"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@SimplyTimed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Tempo simples de busca"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@Timed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Tempo completo de busca"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Restaurante&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;restauranteOp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Restaurante&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findByIdOptional&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;idRestaurante&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;restauranteOp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NotFoundException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Restaurante não existe"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pratos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Prato&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"restaurante"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;restauranteOp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pratoMapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paraListaPratoApi&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pratos&lt;/span&gt;&lt;span class="o"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No exemplo acima, poderíamos colocar qualquer coisa dentro de &lt;strong&gt;Response.ok()&lt;/strong&gt;, porém, isso não geraria erro de compilação:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="nd"&gt;@Counted&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Quantidade buscas restaurante"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@SimplyTimed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Tempo simples de busca"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@Timed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Tempo completo de busca"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt; &lt;span class="nf"&gt;recuperaPratosRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;LocalDate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Lembrando que analisando friamente esse é um problema decorrente da minha escolha arquitetural. O Vinícius não teve esse problema na resolução dele.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Mais "problemas" com OpenAPI e JAX-RS
&lt;/h3&gt;

&lt;p&gt;Outro problema que encontrei foi com anotações do &lt;strong&gt;Swagger&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Observe uma classe gerada em um projeto &lt;strong&gt;SpringBoot&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.swagger.v3.oas.annotations.Operation&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.swagger.v3.oas.annotations.Parameter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.swagger.v3.oas.annotations.responses.ApiResponse&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.swagger.v3.oas.annotations.security.SecurityRequirement&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.validation.Valid&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.http.ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.PathVariable&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.RequestMapping&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.ResponseBody&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;RestaurantesApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Operation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;operationId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"atualizaPratoRestaurante"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"prato"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"restaurante"&lt;/span&gt; &lt;span class="o"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;responses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nd"&gt;@ApiResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;responseCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"204"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"No Content"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nd"&gt;@SecurityRequirement&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ifood_auth"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt; &lt;span class="s"&gt;"write:restaurantes"&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RequestMethod&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PUT&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/restaurantes/{idRestaurante}/pratos/{idPrato}"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;consumes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;atualizaPratoRestaurante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nd"&gt;@Parameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"idPrato"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idPrato"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idPrato&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Parameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idRestaurante"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;idRestaurante&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Parameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"AtualizacaoPrato"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nd"&gt;@Valid&lt;/span&gt; &lt;span class="nd"&gt;@RequestBody&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;AtualizacaoPrato&lt;/span&gt; &lt;span class="n"&gt;atualizacaoPrato&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOT_IMPLEMENTED&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Nessa abordagem vemos que é documentado o Request e Response do nosso método em nossa interface. Temos um "problema" com o &lt;strong&gt;JAX-RS&lt;/strong&gt;, o &lt;strong&gt;Swagger&lt;/strong&gt; não faz parte da especificação do &lt;strong&gt;Java&lt;/strong&gt;, e precisaríamos utilizar o &lt;strong&gt;Microprofile&lt;/strong&gt; para isso.&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/quarkusio/quarkus/issues/22429" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Quarkus, Swagger Ignore method/Class
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#22429&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/CormegaGit" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F91286658%3Fv%3D4" alt="CormegaGit avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/CormegaGit" rel="noopener noreferrer"&gt;CormegaGit&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/quarkusio/quarkus/issues/22429" rel="noopener noreferrer"&gt;&lt;time&gt;Dec 21, 2021&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Describe the bug&lt;/h3&gt;
&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I have a Quarkus app and i am using Swagger interface for those REST API, and all my methods are visible, i want to ignore some of them to dot be visible when i am using quarkus and i have tried like below, and also added some other @ApiOperation and so one,&lt;/p&gt;
&lt;p&gt;When i am using Swagger all my methods are visible on Swagger interface so i dont know how to ignore some of them.&lt;/p&gt;
&lt;p&gt;@GET
@Produces(MediaType.TEXT_PLAIN)
@Operation(hidden = true)
@Schema(hidden=true)
public TemplateInstance getGetSMTest(@QueryParam("name") String name){
LOG.info("called page /getSMTest");
return getSMTest.data("name", name);
}&lt;/p&gt;
&lt;p&gt;Best Regards,
Daniel Sanchi&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Expected behavior&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;No response&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Actual behavior&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;No response&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;How to Reproduce?&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;No response&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Output of &lt;code&gt;uname -a&lt;/code&gt; or &lt;code&gt;ver&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;No response&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Output of &lt;code&gt;java -version&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;No response&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;GraalVM version (if different from Java)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;No response&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Quarkus version or git rev&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;No response&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Build tool (ie. output of &lt;code&gt;mvnw --version&lt;/code&gt; or &lt;code&gt;gradlew --version&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;No response&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Additional information&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;No response&lt;/em&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/quarkusio/quarkus/issues/22429" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;"Yes, we are based on microprofile open API and does not support swagger. You can remove the swagger dependency from your classpath",  &lt;a href="https://github.com/phillip-kruger" rel="noopener noreferrer"&gt;phillip-kruger&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Até vi a &lt;a href="https://github.com/OpenAPITools/openapi-generator/issues/795" rel="noopener noreferrer"&gt;issue 795 aberta no OpenAPIGen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Além de duas abordagens, uma com o &lt;a href="https://github.com/apache/geronimo-openapi" rel="noopener noreferrer"&gt;Apache Geronimo&lt;/a&gt;:&lt;/p&gt;


&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;div class="ltag__stackexchange--header"&gt;
          &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackoverflow-logo-b42691ae545e4810b105ee957979a853a696085e67e43ee14c5699cf3e890fb4.svg" alt=""&gt;
          &lt;a href="https://stackoverflow.com/questions/58317084/microprofile-generate-open-api-file-on-build" rel="noopener noreferrer"&gt;
            Microprofile generate Open-Api File on build
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;Oct 10 '19&lt;/span&gt;
            &lt;span&gt;Comments: 1&lt;/span&gt;
            &lt;span&gt;Answers: 1&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://stackoverflow.com/questions/58317084/microprofile-generate-open-api-file-on-build" rel="noopener noreferrer"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          0
        &lt;/div&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;prior to using Eclipse Microprofile we've generated our open-api files via the &lt;code&gt;io.openapitools.swagger:swagger-maven-plugin&lt;/code&gt;
This plugin relies on the &lt;code&gt;io.swagger.core.v3:swagger-annotations&lt;/code&gt; maven dependency.&lt;/p&gt;

&lt;p&gt;Eclipse Microprofile though comes with a different dependency which does not seem to be enough for the openapitools plugin, therfore the generated open-api file does not contain any…&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    &lt;a href="https://stackoverflow.com/questions/58317084/microprofile-generate-open-api-file-on-build" class="ltag__stackexchange--btn" rel="noopener noreferrer"&gt;Open Full Question&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;E outra com o &lt;strong&gt;MicroGen&lt;/strong&gt;:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://microgen.io/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmicrogen.io%2Fimages%2Fjakartaee-logo.png" height="200" class="m-0" width="700"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://microgen.io/" rel="noopener noreferrer" class="c-link"&gt;
          MicroGen | An OpenAPI Spec Generator for Eclipse JakartaEE + Eclipse MicroProfile
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          An OpenAPI Spec Generator for Eclipse JakartaEE + Eclipse MicroProfile
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
        microgen.io
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Mas não cheguei a testar nenhuma das duas.&lt;/p&gt;

&lt;p&gt;Na abordagem que estamos seguindo, para minha filosofia a escrita de &lt;strong&gt;org.eclipse.microprofile.openapi.annotations.responses.APIResponseSchema&lt;/strong&gt; ou &lt;strong&gt;org.eclipse.microprofile.openapi.annotations.tags.Tag&lt;/strong&gt; na nossa classe de &lt;strong&gt;Resource&lt;/strong&gt; configura uma intervenção manual que pode levar a algum problema futuro se eu esquecer de evoluir esse métodos. Por isso, &lt;strong&gt;eu optei por não realizar tal configuração&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por esse motivo também desabilitei a configuração &lt;strong&gt;useSwaggerAnnotations&lt;/strong&gt;, uma vez que não são as anotações que desejamos expor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lembrando que com relação os problemas que eu levantei estão atrelados a decisões arquiteturais que eu decidi seguir. O Response do JAX-RS é um que acho que poderia ser melhorado, mas os demais estão mais atrelados à minha escolha pelo OpenAPI Generation&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demais configurações
&lt;/h2&gt;

&lt;p&gt;As próximas configurações do plugin dizem respeito ao vínculo da geração de código à task de compilação de Java, bem como colocar as classes geradas no nosso &lt;strong&gt;sourceSet&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;compileJava&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dependsOn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;generateApiServer&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sourceSets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;srcDir&lt;/span&gt; &lt;span class="s2"&gt;"$apiServerOutput/src/gen/java"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Uma vez que essas configurações estejam definidas basta executar a task &lt;strong&gt;generateApiServer&lt;/strong&gt; ou mesmo a task &lt;strong&gt;compileJava&lt;/strong&gt; ou mesmo alguma que dependa dela, como &lt;strong&gt;build&lt;/strong&gt;, &lt;strong&gt;test&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Com isso, nossas classes serão geradas em &lt;strong&gt;"$buildDir/generated/openapi-code-server".toString()&lt;/strong&gt; com base no &lt;strong&gt;OpenAPI&lt;/strong&gt; definido em &lt;strong&gt;applications/cadastro/src/main/resources/openapi/restaurantes_v1.yml&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Na nossa classe de &lt;strong&gt;Resource&lt;/strong&gt; &lt;strong&gt;applications/cadastro/src/main/java/com/gitlab/arthurfnsc/ifood/cadastro/RestauranteResource&lt;/strong&gt; implentamos a interface gerada:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.openapi.server.v1.restaurantes.api.RestaurantesApi&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RestauranteResource&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;RestaurantesApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Isso já será o suficiente para recebermos um erro de compilação, pois precisamos implementar os métodos da interface que estamos implementando.&lt;/p&gt;

&lt;p&gt;Essa é uma das vantagens do conceito de &lt;strong&gt;API First&lt;/strong&gt;! Imagine que adicionemos outros métodos em nossa &lt;strong&gt;OpenAPI&lt;/strong&gt; ou que removamos um método ou que adicionemos mais parâmetros em um método. Quando executarmos a task de geração de código receberemos erro de compilação, seja por métodos que removemos, seja por métodos que precisamos adicionar ou adicionar parâmetros.&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusão e observações da decisão arquitetural
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://giphy.com/gifs/abcnetwork-decision-decide-kevin-oleary-L3c8aAACw7Qpx2ojGB" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia2.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExZzZ0a3hhNHB0ODdvanZ5NGh0NWZzM2kyZ21rMHpwODJvdmZ1NDR3YSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FL3c8aAACw7Qpx2ojGB%2Fgiphy.webp" height="270" class="m-0" width="480"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://giphy.com/gifs/abcnetwork-decision-decide-kevin-oleary-L3c8aAACw7Qpx2ojGB" rel="noopener noreferrer" class="c-link"&gt;
          Offer Decide GIF by ABC Network - Find &amp;amp; Share on GIPHY
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Discover &amp;amp; share this Offer Decide GIF by ABC Network with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiphy.com%2Fstatic%2Fimg%2Ffavicon.png" width="16" height="16"&gt;
        giphy.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;A escolha arquitetural da utilização de &lt;strong&gt;API First&lt;/strong&gt; com &lt;strong&gt;Open API Generator&lt;/strong&gt; nos trouxe alguns benefícios como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acoplamento com o contrato de serviço e suas evoluções.&lt;/li&gt;
&lt;li&gt;Facilidade na descoberta de quebra de contrato de APIs definidas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Porém, também nos trouxe alguns desafios que não foram passados pelo &lt;a class="mentioned-user" href="https://dev.to/viniciusfcf"&gt;@viniciusfcf&lt;/a&gt; dado o fato de outra abordagem arquitetural:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Liberdade de implementação de endpoints&lt;/li&gt;
&lt;li&gt;Gerador do &lt;strong&gt;JAX-RS&lt;/strong&gt; não estar 100% alinhado com nossas expectativas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para além disso, gostaria de trazer mais alguns pontos que já testei com a abordagem e coisas que percebi que ela não resolve:&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenAPI Generator sempre vai estar defasado com relação à especificação
&lt;/h2&gt;

&lt;p&gt;Um ponto interessante para gerar uma discussão sobre o &lt;strong&gt;OpenAPI Generator&lt;/strong&gt; é que ele invariavelmente vai estar defasado com relação ao número de features da própria especificação &lt;strong&gt;OpenAPI&lt;/strong&gt;, afinal, quando uma abordagem como essa é criada, o foco inicial é na resolução dos problemas mais comuns e não de todos os problemas.&lt;/p&gt;

&lt;p&gt;Pegue por exemplo uma coisa bem bacana do &lt;strong&gt;OpenAPI 3&lt;/strong&gt;, a &lt;a href="https://swagger.io/docs/specification/describing-responses/" rel="noopener noreferrer"&gt;reutilização de responses&lt;/a&gt; com &lt;strong&gt;component responses&lt;/strong&gt;. O código a seguir está na seção &lt;strong&gt;Reusing Responses&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;/users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Gets a list of users.&lt;/span&gt;
      &lt;span class="na"&gt;response&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;200'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OK&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/ArrayOfUsers'&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;401'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/responses/Unauthorized'&lt;/span&gt;   &lt;span class="c1"&gt;# &amp;lt;-----&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Gets a user by ID.&lt;/span&gt;
      &lt;span class="na"&gt;response&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;200'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OK&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/User'&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;401'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/responses/Unauthorized'&lt;/span&gt;   &lt;span class="c1"&gt;# &amp;lt;-----&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;404'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/responses/NotFound'&lt;/span&gt;       &lt;span class="c1"&gt;# &amp;lt;-----&lt;/span&gt;
&lt;span class="c1"&gt;# Descriptions of common components&lt;/span&gt;
&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;NotFound&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;The specified resource was not found&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/Error'&lt;/span&gt;
    &lt;span class="na"&gt;Unauthorized&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Unauthorized&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/Error'&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Schema for error response body&lt;/span&gt;
    &lt;span class="na"&gt;Error&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;code&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;message&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veja que dessa forma podemos reusar as seguintes especificações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;        &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;401'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/responses/Unauthorized'&lt;/span&gt;
&lt;span class="err"&gt;        &lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;404'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/responses/NotFound'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso tornaria nossa especificação mais enxuta. Há alguns anos atrás quando testei isso não funcionava com o gerador. Testando hoje, vi que funciona, porém, é bem comum ver pontos de melhoria e adequação solicitados nas &lt;a href="https://github.com/OpenAPITools/openapi-generator/issues" rel="noopener noreferrer"&gt;issues do projeto&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Invariavelmente ficamos atrelados ao gerador para o bem ou para o mal.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenAPI Generator definitivamente não combina com Serverless
&lt;/h2&gt;

&lt;p&gt;Se você clonou o projeto e importou em sua IDE, provavelmente percebeu vários erros decorrentes das classes que precisam ser geradas para que sejam encontradas. Por isso colocamos o seguinte código na nossa configuração.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;compileJava&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dependsOn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;generateApiServer&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se por um acaso você leu o README e foi executar o projeto, percebeu o seguinte output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./gradlew clean :applications:cadastro:quarkusDev
&lt;span class="c"&gt;################################################################################&lt;/span&gt;
&lt;span class="c"&gt;# Thanks for using OpenAPI Generator.                                          #&lt;/span&gt;
&lt;span class="c"&gt;# Please consider donation to help us maintain this project 🙏                 #&lt;/span&gt;
&lt;span class="c"&gt;# https://opencollective.com/openapi_generator/donate                          #&lt;/span&gt;
&lt;span class="c"&gt;################################################################################&lt;/span&gt;
Successfully generated code to /home/arthurfnsc/repos/udemy/ifood/applications/cadastro/build/generated/openapi-code-server
Listening &lt;span class="k"&gt;for &lt;/span&gt;transport dt_socket at address: 5005
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que para executar o projeto do zero precisamos criar algumas classes: &lt;strong&gt;Successfully generated code to /home/arthurfnsc/repos/udemy/ifood/applications/cadastro/build/generated/openapi-code-server&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4gpflx0oj9j3z6vqknx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4gpflx0oj9j3z6vqknx.png" alt="AWS Lambda Function" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No exemplo acima, imagine que o nosso projeto &lt;strong&gt;AWS Lambda Function&lt;/strong&gt; utilize essa estratégia. Iremos perder um tempo para executar a requisição porque vamos precisar gerar código antes. E, mesmo depois disso, se nossa Lambda entrar em um contexto de inativação, será necessário gerar novamente código, onerando o processo.&lt;/p&gt;

&lt;p&gt;No demais, lembrem-se, não existe bala de prata!&lt;/p&gt;

&lt;p&gt;No próximo post falaremos da abordagem de &lt;strong&gt;API First&lt;/strong&gt; em projetos de &lt;strong&gt;APIs reativas&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse post faz parte de uma série sobre &lt;strong&gt;Cursos que formaram meu caráter: Desenvolvimento web com Quarkus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A série completa é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-talk-is-cheap-show-me-the-code-2k91"&gt;Talk is cheap show me the code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn"&gt;Utilizando Gradle ao invés de Maven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na"&gt;Plugins do Gradle: Gerenciador de versões de bibliotecas com Versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-saudades-do-maven-relatorios-com-project-report-51d6"&gt;Plugins do Gradle: Saudades do  Maven, relatórios com Project-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: API First com o OpenAPI Generator&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-para-apis-reativas-3o9b"&gt;Plugins do Gradle: API First com o OpenAPI Generator para APIs reativas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-validacao-de-vulnerabilidades-com-owasp-dependency-check-2a2l"&gt;Plugins do Gradle: Validação de vulnerabilidades de dependências com OWASP Dependency Check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: Lint com Spotless [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Motivação para a escolha [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Considerações sobre o Prettier em pipelines [não publicado]&lt;/li&gt;
&lt;li&gt;Gitmoji [não publicado]&lt;/li&gt;
&lt;li&gt;SDK Man [não publicado]&lt;/li&gt;
&lt;li&gt;Pré commit hook [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando YML em propriedades de aplicação [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando variáveis de ambiente [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Sobrescrevendo opções em teste [não publicado]&lt;/li&gt;
&lt;li&gt;Mapstruct: Utilizando expressões para mapeamentos [não publicado]&lt;/li&gt;
&lt;li&gt;Microprofile SecurityScheme: Sobrescrevendo tokenUrl [não publicado]&lt;/li&gt;
&lt;li&gt;Prometheus: O problema simples que me custou algumas horas [não publicado]&lt;/li&gt;
&lt;li&gt;quarkus-hibernate-reactive-panache: Utilizando as vantagens do Hibernate em projetos reativos [não publicado]&lt;/li&gt;
&lt;li&gt;Testcontainers: Configuração para projetos reativos [não publicado]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gradle</category>
      <category>jaxrs</category>
      <category>openapi</category>
      <category>quarkus</category>
    </item>
    <item>
      <title>Cursos que formaram meu caráter: Desenvolvimento web com Quarkus - Saudades do Maven, relatórios com Project-report</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Wed, 14 Dec 2022 20:42:10 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-saudades-do-maven-relatorios-com-project-report-51d6</link>
      <guid>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-saudades-do-maven-relatorios-com-project-report-51d6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"Um site ruim é como um vendedor rabugento". Jakob Nielsen&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse quarto posts falaremos sobre um ponto que não gera muito impacto no projeto, mas que eu acho mais elegante a opção com &lt;a href="https://maven.apache.org/" rel="noopener noreferrer"&gt;Maven&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O ponto é como trazer diferentes perspectivas sobre o nosso projeto em um único lugar (o que não consegui com o &lt;a href="https://gradle.org/" rel="noopener noreferrer"&gt;Gradle&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Esse artigo faz parte de uma série, abaixo é possível encontrar a lista completa de artigos.&lt;/p&gt;

&lt;p&gt;Estamos nos baseando no curso &lt;a href="https://www.udemy.com/course/des-web-quarkus" rel="noopener noreferrer"&gt;Desenvolvimento web com Quarkus&lt;/a&gt; do &lt;a class="mentioned-user" href="https://dev.to/viniciusfcf"&gt;@viniciusfcf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O repositório que estamos utilizando é:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgitlab.com%2Fassets%2Ftwitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" height="800" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" rel="noopener noreferrer" class="c-link"&gt;
          udemy / Desenvolvimento Web com Quarkus / ifood · GitLab
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          GitLab.com
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgitlab.com%2Fassets%2Ffavicon-72a2cad5025aa931d6ea56c3201d1f18e68a8cd39788c7c80d5b2b82aa5143ef.png" width="32" height="32"&gt;
        gitlab.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Tradeoffs
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://giphy.com/gifs/season-15-the-simpsons-15x18-l2Je7awyXi7rKeNLa" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExNGxvazE5YXFnNXQycW01Z2J1OXoxZHEzZnUwanBxYjIxajlhMGtjYyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2Fl2Je7awyXi7rKeNLa%2Fgiphy.webp" height="362" class="m-0" width="480"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://giphy.com/gifs/season-15-the-simpsons-15x18-l2Je7awyXi7rKeNLa" rel="noopener noreferrer" class="c-link"&gt;
          sad bart simpson GIF - Find &amp;amp; Share on GIPHY
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Discover &amp;amp; share this sad bart simpson GIF with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiphy.com%2Fstatic%2Fimg%2Ffavicon.png" width="16" height="16"&gt;
        giphy.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Sabe aquela conversa que o "nosso produto é melhor que o do concorrente em todos os aspectos"? Pois bem...&lt;/p&gt;

&lt;p&gt;Brincadeiras à parte, o objetivo desse post está mais em enaltecer uma abordagem do &lt;strong&gt;Maven&lt;/strong&gt; pouco utilizada para documentação.&lt;/p&gt;

&lt;p&gt;É sr &lt;a href="https://stackoverflow.com/users/1273394/tim" rel="noopener noreferrer"&gt;Tim&lt;/a&gt; eu sei como você se sente:&lt;/p&gt;


&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;div class="ltag__stackexchange--header"&gt;
          &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackoverflow-logo-b42691ae545e4810b105ee957979a853a696085e67e43ee14c5699cf3e890fb4.svg" alt=""&gt;
          &lt;a href="https://stackoverflow.com/questions/30383304/maven-site-in-gradle" rel="noopener noreferrer"&gt;
            Maven site in gradle
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;May 21 '15&lt;/span&gt;
            &lt;span&gt;Comments: 1&lt;/span&gt;
            &lt;span&gt;Answers: 2&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://stackoverflow.com/questions/30383304/maven-site-in-gradle" rel="noopener noreferrer"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          8
        &lt;/div&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;Is there a plugin in gradle which can generate maven site similar thing? It would be great if it was compatible with current maven site apt format file.&lt;/p&gt;

    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    &lt;a href="https://stackoverflow.com/questions/30383304/maven-site-in-gradle" class="ltag__stackexchange--btn" rel="noopener noreferrer"&gt;Open Full Question&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Mas o que afinal de contas o Maven Site faz?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://maven.apache.org/plugins/maven-site-plugin" rel="noopener noreferrer"&gt;Maven Site Plugin&lt;/a&gt; é um plugin que cria relatórios do projeto. Um ponto interessante é que mais do que criar os relatórios do plugin, também é possível integrar com relatórios de Testes, Versão de dependências, dentre outros.&lt;/p&gt;

&lt;p&gt;Peguemos por exemplo o código do &lt;a href="https://github.com/junit-team/junit4" rel="noopener noreferrer"&gt;JUnit 4&lt;/a&gt;, com o código escrito no &lt;strong&gt;pom.xml&lt;/strong&gt; é possível chegar ao seguinte resultado:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://junit.org/junit4/project-info.html" rel="noopener noreferrer"&gt;
      junit.org
    &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Observem as informações que são possível de serem documentadas, como informações sobre configuração da biblioteca, licença do projeto, desenvolvedores, dentre outras.&lt;/p&gt;

&lt;p&gt;Pela nostalgia voltei até aquele projeto que eu tinha falado no &lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn"&gt;post sobre a mudança de Maven para Gradle&lt;/a&gt; e voltando para a configuração do Maven, rodei o famoso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;foo@bar:~&lt;span class="nv"&gt;$ &lt;/span&gt;./mvnw site
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3er3ieqh6n1el3fu7ncf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3er3ieqh6n1el3fu7ncf.png" alt="Project Information" width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9ahka18d6l1v0dw88ih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9ahka18d6l1v0dw88ih.png" alt="Dependency Convergence" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkprux15hxrq8lz0p1m3q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkprux15hxrq8lz0p1m3q.png" alt=" Dependency Updates Report" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi827jws3ee949n7qyq02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi827jws3ee949n7qyq02.png" alt=" Plugin Updates Report" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fse1dqt29i2wscknczz7p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fse1dqt29i2wscknczz7p.png" alt=" Property Updates Report" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alguns reports interessantes são os de versão de dependências e plugins, que ficam mais bonitos que &lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na"&gt;os nossos usando o Gradle Plugin Version&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Mas e com o Gradle?
&lt;/h2&gt;

&lt;p&gt;Bom... como nem tudo são flores, o que consegui com o &lt;strong&gt;Gradle&lt;/strong&gt; foi o plugin &lt;strong&gt;Project-Report&lt;/strong&gt;:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://docs.gradle.org/current/userguide/project_report_plugin.html" rel="noopener noreferrer"&gt;
      docs.gradle.org
    &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;A configuração dele está no &lt;strong&gt;build.gradle&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;subprojects&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;'applications'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/docs.gradle"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;e em &lt;strong&gt;plugins/docs.gradle&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s2"&gt;"project-report"&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;htmlDependencyReport&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;projects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;allprojects&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Com ele, podemos executar a task &lt;strong&gt;dependencyReport&lt;/strong&gt;, que gerará um report dentro da pasta &lt;strong&gt;build&lt;/strong&gt; de cada subprojeto nosso como o seguinte:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nt"&gt;------------------------------------------------------------&lt;/span&gt;
Project &lt;span class="s1"&gt;':applications:cadastro'&lt;/span&gt;
&lt;span class="nt"&gt;------------------------------------------------------------&lt;/span&gt;

annotationProcessor - Annotation processors and their dependencies &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;source set&lt;/span&gt; &lt;span class="s1"&gt;'main'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
+--- org.mapstruct:mapstruct-processor:1.5.3.Final
&lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; io.quarkus:quarkus-panache-common:2.14.3.Final
     +--- io.quarkus:quarkus-core:2.14.3.Final
     |    +--- jakarta.annotation:jakarta.annotation-api:1.3.5
     |    +--- jakarta.enterprise:jakarta.enterprise.cdi-api:2.0.2
     |    |    +--- jakarta.el:jakarta.el-api:3.0.3
     |    |    +--- jakarta.interceptor:jakarta.interceptor-api:1.2.5
     |    |    |    +--- jakarta.annotation:jakarta.annotation-api:1.3.5
     |    |    |    &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; jakarta.ejb:jakarta.ejb-api:3.2.6
     |    |    |         &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; jakarta.transaction:jakarta.transaction-api:1.3.2 -&amp;gt; 1.3.3
     |    |    &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; jakarta.inject:jakarta.inject-api:1.0
     |    +--- jakarta.inject:jakarta.inject-api:1.0
     |    +--- io.quarkus:quarkus-ide-launcher:2.14.3.Final
     |    +--- io.quarkus:quarkus-development-mode-spi:2.14.3.Final
     |    +--- io.smallrye.config:smallrye-config:2.12.1
     |    |    +--- io.smallrye.config:smallrye-config-core:2.12.1
     |    |    |    +--- org.eclipse.microprofile.config:microprofile-config-api:2.0.1
     |    |    |    +--- io.smallrye.common:smallrye-common-annotation:1.13.1
     |    |    |    +--- io.smallrye.common:smallrye-common-expression:1.13.1
     |    |    |    |    +--- io.smallrye.common:smallrye-common-function:1.13.1
     |    |    |    |    |    &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; io.smallrye.common:smallrye-common-constraint:1.13.1
     |    |    |    |    |         &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; org.jboss.logging:jboss-logging:3.4.3.Final -&amp;gt; 3.5.0.Final
     |    |    |    |    &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; org.jboss.logging:jboss-logging:3.4.3.Final -&amp;gt; 3.5.0.Final
     |    |    |    +--- io.smallrye.common:smallrye-common-constraint:1.13.1 &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
     |    |    |    +--- io.smallrye.common:smallrye-common-classloader:1.13.1
     |    |    |    +--- org.jboss.logging:jboss-logging:3.4.3.Final -&amp;gt; 3.5.0.Final
     |    |    |    +--- org.ow2.asm:asm:9.3
     |    |    |    &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; io.smallrye.config:smallrye-config-common:2.12.1
     |    |    |         +--- org.eclipse.microprofile.config:microprofile-config-api:2.0.1
     |    |    |         +--- io.smallrye.common:smallrye-common-classloader:1.13.1
     |    |    |         &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; org.jboss.logging:jboss-logging:3.4.3.Final -&amp;gt; 3.5.0.Final
     |    |    &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; org.jboss.logging:jboss-logging:3.4.3.Final -&amp;gt; 3.5.0.Final
     |    +--- org.jboss.logging:jboss-logging:3.5.0.Final
     |    +--- org.jboss.logmanager:jboss-logmanager-embedded:1.0.11
     |    |    &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; org.wildfly.common:wildfly-common:1.5.0.Final-format-001 -&amp;gt; 1.5.4.Final-format-001
     |    +--- org.jboss.logging:jboss-logging-annotations:2.2.1.Final
     |    +--- org.jboss.threads:jboss-threads:3.4.3.Final
     |    |    +--- org.jboss.logging:jboss-logging:3.4.1.Final -&amp;gt; 3.5.0.Final
     |    |    &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; org.wildfly.common:wildfly-common:1.5.0.Final -&amp;gt; 1.5.4.Final-format-001
     |    +--- org.slf4j:slf4j-api:1.7.36
     |    +--- org.jboss.slf4j:slf4j-jboss-logmanager:1.2.0.Final
     |    +--- org.graalvm.sdk:graal-sdk:22.3.0
     |    +--- org.wildfly.common:wildfly-common:1.5.4.Final-format-001
     |    +--- io.quarkus:quarkus-bootstrap-runner:2.14.3.Final
     |    |    +--- io.smallrye.common:smallrye-common-io:1.13.2
     |    |    +--- org.jboss.logmanager:jboss-logmanager-embedded:1.0.11 &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
     |    |    +--- org.jboss.logging:jboss-logging:3.5.0.Final
     |    |    &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; io.github.crac:org-crac:0.1.1
     |    &lt;span class="se"&gt;\-&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; io.quarkus:quarkus-fs-util:0.0.9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;O report é bem maior que isso, dado o número de dependências que temos, cortei para não ficar tão grande.&lt;/p&gt;

&lt;p&gt;Temos a task &lt;strong&gt;htmlDependencyReport&lt;/strong&gt; que gera um report em HTML dentro da pasta &lt;strong&gt;build&lt;/strong&gt; de cada subprojeto nosso como o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6n67jmwbkoaut2xrkm2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6n67jmwbkoaut2xrkm2b.png" alt="htmlDependencyReport" width="800" height="709"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um ponto que precisei alterar no nosso projeto foi a configuração &lt;strong&gt;org.gradle.jvmargs=-Xmx4096m&lt;/strong&gt; em &lt;strong&gt;gradle.properties&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./gradlew clean htmlDependencyReport

FAILURE: Build failed with an exception.

&lt;span class="k"&gt;*&lt;/span&gt; What went wrong:
Execution failed &lt;span class="k"&gt;for &lt;/span&gt;task &lt;span class="s1"&gt;':applications:cadastro:htmlDependencyReport'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Java heap space

&lt;span class="k"&gt;*&lt;/span&gt; Try:
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Run with &lt;span class="nt"&gt;--stacktrace&lt;/span&gt; option to get the stack trace.
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Run with &lt;span class="nt"&gt;--info&lt;/span&gt; or &lt;span class="nt"&gt;--debug&lt;/span&gt; option to get more log output.
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Run with &lt;span class="nt"&gt;--scan&lt;/span&gt; to get full insights.

&lt;span class="k"&gt;*&lt;/span&gt; Get more &lt;span class="nb"&gt;help &lt;/span&gt;at https://help.gradle.org

BUILD FAILED &lt;span class="k"&gt;in &lt;/span&gt;16s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Antes eu estava recebendo problemas de &lt;strong&gt;heap space no Java&lt;/strong&gt;, para isso, aumentei  a quantidade de RAM que o Gradle pode usar, como mencionado aqui:&lt;/p&gt;


&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;div class="ltag__stackexchange--header"&gt;
          &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackoverflow-logo-b42691ae545e4810b105ee957979a853a696085e67e43ee14c5699cf3e890fb4.svg" alt=""&gt;
          &lt;a href="https://stackoverflow.com/questions/63088123/gradle-build-fails-with-out-of-memory-java-heap-space-error" rel="noopener noreferrer"&gt;
            Gradle build fails with Out of Memory: Java heap space error
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;Jul 25 '20&lt;/span&gt;
            &lt;span&gt;Comments: 3&lt;/span&gt;
            &lt;span&gt;Answers: 4&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://stackoverflow.com/questions/63088123/gradle-build-fails-with-out-of-memory-java-heap-space-error" rel="noopener noreferrer"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          32
        &lt;/div&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;I am getting gradle build error while running the app. I am using windows 10 with 8GB RAM, Android studio version 4.0.1&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Out of memory: Java heap space. Please assign more memory to Gradle in
the project's gradle.properties file. For example, the following line
in the gradle.properties file, sets the…&lt;/p&gt;
&lt;/blockquote&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    &lt;a href="https://stackoverflow.com/questions/63088123/gradle-build-fails-with-out-of-memory-java-heap-space-error" class="ltag__stackexchange--btn" rel="noopener noreferrer"&gt;Open Full Question&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6m48lu8ap2ott2bclz1a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6m48lu8ap2ott2bclz1a.jpg" alt="Bad quality comparation" width="448" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É... não tem nem como comparar a robustez e relatórios da solução com &lt;strong&gt;Maven&lt;/strong&gt;, ainda que o Maven Site precise dar um tapa na parte de &lt;strong&gt;UI&lt;/strong&gt; e &lt;strong&gt;UX&lt;/strong&gt;, ainda sim os insights e relatórios que podemos disponibilizar são bem interessantes.&lt;/p&gt;

&lt;p&gt;Para quem usa o &lt;strong&gt;Gradle&lt;/strong&gt; e conhecer algum outro plugin para a mesma finalidade, sou todo ouvidos.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse post faz parte de uma série sobre &lt;strong&gt;Cursos que formaram meu caráter: Desenvolvimento web com Quarkus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A série completa é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-talk-is-cheap-show-me-the-code-2k91"&gt;Talk is cheap show me the code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn"&gt;Utilizando Gradle ao invés de Maven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na"&gt;Plugins do Gradle: Gerenciador de versões de bibliotecas com Versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: Saudades do  Maven, relatórios com Project-report&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm"&gt;Plugins do Gradle: API First com o OpenAPI Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-para-apis-reativas-3o9b"&gt;Plugins do Gradle: API First com o OpenAPI Generator para APIs reativas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-validacao-de-vulnerabilidades-com-owasp-dependency-check-2a2l"&gt;Plugins do Gradle: Validação de vulnerabilidades de dependências com OWASP Dependency Check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: Lint com Spotless [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Motivação para a escolha [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Considerações sobre o Prettier em pipelines [não publicado]&lt;/li&gt;
&lt;li&gt;Gitmoji [não publicado]&lt;/li&gt;
&lt;li&gt;SDK Man [não publicado]&lt;/li&gt;
&lt;li&gt;Pré commit hook [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando YML em propriedades de aplicação [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando variáveis de ambiente [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Sobrescrevendo opções em teste [não publicado]&lt;/li&gt;
&lt;li&gt;Mapstruct: Utilizando expressões para mapeamentos [não publicado]&lt;/li&gt;
&lt;li&gt;Microprofile SecurityScheme: Sobrescrevendo tokenUrl [não publicado]&lt;/li&gt;
&lt;li&gt;Prometheus: O problema simples que me custou algumas horas [não publicado]&lt;/li&gt;
&lt;li&gt;quarkus-hibernate-reactive-panache: Utilizando as vantagens do Hibernate em projetos reativos [não publicado]&lt;/li&gt;
&lt;li&gt;Testcontainers: Configuração para projetos reativos [não publicado]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gradle</category>
      <category>maven</category>
      <category>quarkus</category>
      <category>site</category>
    </item>
    <item>
      <title>Cursos que formaram meu caráter: Desenvolvimento web com Quarkus - Gerenciador de versões de bibliotecas com Versions</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Wed, 14 Dec 2022 03:16:01 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na</link>
      <guid>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"Você torna o mundo um lugar melhor fazendo melhorias diárias para se tornar a melhor versão de si mesmo". Roy T. Bennett, The Light in the Heart&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse terceiro posts falaremos sobre o gerenciamento de versões utilizando o &lt;a href="https://github.com/ben-manes/gradle-versions-plugin" rel="noopener noreferrer"&gt;Gradle Versions Plugin&lt;/a&gt; do &lt;a href="https://github.com/ben-manes" rel="noopener noreferrer"&gt;Ben Manes&lt;/a&gt;. Isso nos ajudará a manter nosso projeto com as dependências atualizadas.&lt;/p&gt;

&lt;p&gt;Discutiremos também os problemas que isso pode causar, e o porque não termos um fluxo de &lt;a href="https://martinfowler.com/articles/continuousIntegration.html" rel="noopener noreferrer"&gt;Continuous Integration&lt;/a&gt; pode nos dar grandes dores de cabeça.&lt;/p&gt;

&lt;p&gt;Por fim, falarei do &lt;a href="https://dependabot-gitlab.gitlab.io/dependabot/" rel="noopener noreferrer"&gt;Dependabot&lt;/a&gt;. Não apliquei nesse projeto, mas vou colocar no backlog, e quem sabe escrever em um outro post.&lt;/p&gt;

&lt;p&gt;Esse artigo faz parte de uma série, abaixo é possível encontrar a lista completa de artigos.&lt;/p&gt;

&lt;p&gt;Estamos nos baseando no curso &lt;a href="https://www.udemy.com/course/des-web-quarkus" rel="noopener noreferrer"&gt;Desenvolvimento web com Quarkus&lt;/a&gt; do &lt;a class="mentioned-user" href="https://dev.to/viniciusfcf"&gt;@viniciusfcf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O repositório que estamos utilizando é:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgitlab.com%2Fassets%2Ftwitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" height="800" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" rel="noopener noreferrer" class="c-link"&gt;
          udemy / Desenvolvimento Web com Quarkus / ifood · GitLab
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          GitLab.com
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgitlab.com%2Fassets%2Ffavicon-72a2cad5025aa931d6ea56c3201d1f18e68a8cd39788c7c80d5b2b82aa5143ef.png" width="32" height="32"&gt;
        gitlab.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  O tempo passa, o tempo voa
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/cgk3daHqeJc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;O tempo é implacável! Mudanças acontecem constantemente, e isso impacta decisões passadas que tomamos.&lt;/p&gt;

&lt;p&gt;No mundo do desenvolvimento de software essa máxima permanece!  Bibliotecas e frameworks são atualizados ou descontinuados; outras vezes podemos descobrir uma vulnerabilidade nas nossas dependências e sermos forçados a realizar mudanças (falaremos um pouco disso em um post futuro chamado Plugins do Gradle: Validação de vulnerabilidades de dependências com OWASP Dependency Check).&lt;/p&gt;

&lt;p&gt;Uma das primeiras ideias que temos é: Vamos deixar o nosso projeto sempre com a última versão das bibliotecas disponíveis!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Para todo problema complexo existe sempre uma solução simples, elegante e completamente errada". H L Mencken&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Qual é o problema podemos ter nessa primeira abordagem? &lt;/p&gt;

&lt;p&gt;Para atualizar uma dependência em um projeto é importante termos algumas coisas em mente, como: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existe uma equipe de sustentação que precisa garantir que as bibliotecas que estamos usando estão em conformidade com uma arquitetura corporativa?&lt;/li&gt;
&lt;li&gt;As bibliotecas que estamos usando funcionam corretamente se todas forem atualizadas para sua última versão?&lt;/li&gt;
&lt;li&gt;O servidor em que a solução será implantada tem suporte a tais bibliotecas?&lt;/li&gt;
&lt;li&gt;dentre outros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse post falarei de uma estratégia para essa atualização, porém, é importante ressaltar que isso não é a bala de prata para todos os projetos, e que sempre é bom acordar as decisões com o time, equipe de arquitetura e/ou liderança técnica responsável.&lt;/p&gt;




&lt;h2&gt;
  
  
  Utilizando um plugin
&lt;/h2&gt;

&lt;p&gt;Um plugin bem interessante do &lt;strong&gt;Gradle&lt;/strong&gt; é o &lt;a href="https://github.com/ben-manes/gradle-versions-plugin" rel="noopener noreferrer"&gt;Gradle Versions Plugin&lt;/a&gt; do &lt;a href="https://github.com/ben-manes" rel="noopener noreferrer"&gt;Ben Manes&lt;/a&gt;. Sua aplicação é bem simples.&lt;/p&gt;

&lt;p&gt;Utilizando o nosso &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" rel="noopener noreferrer"&gt;projeto de referência&lt;/a&gt;, no nosso arquivo &lt;strong&gt;build.gradle&lt;/strong&gt; na raiz do projeto podemos ver algo como o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s2"&gt;"com.github.ben-manes.versions"&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="s2"&gt;"$versionsVersion"&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;subprojects&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;'applications'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/docs.gradle"&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;As configurações do arquivo &lt;strong&gt;plugins/docs.gradle&lt;/strong&gt; serão melhor explicadas adiante.&lt;/p&gt;

&lt;p&gt;Caso você esteja com dúvida sobre esses &lt;strong&gt;$&lt;/strong&gt; no código, dá uma olhada no &lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn"&gt;post anterior&lt;/a&gt; em que falamos sobre &lt;strong&gt;Variáveis de projeto&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Essa primeira parte da configuração nos ajuda a buscar as atualizações de todas as nossas bibliotecas através da seguinte task do &lt;strong&gt;Gradle&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;foo@bar:~&lt;span class="nv"&gt;$ &lt;/span&gt;./gradlew dependencyUpdates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Executando a task vamos ter um resultado semelhante a:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./gradlew dependencyUpdates

------------------------------------------------------------
:applications:cadastro Project Dependency Updates (report to plain text file)
------------------------------------------------------------

The following dependencies are using the latest milestone version:
 - com.approvaltests:approvaltests:18.5.0
 - com.github.database-rider:rider-cdi:1.35.0
 - com.github.database-rider:rider-core:1.35.0
 - com.google.code.gson:gson:2.10
 - org.mapstruct:mapstruct:1.5.3.Final
 - org.mapstruct:mapstruct-processor:1.5.3.Final
 - stax:stax:1.2.0

The following dependencies have later milestone versions:
 - io.opentracing.contrib:opentracing-jdbc [0.2.4 -&amp;gt; 0.2.15]
     https://github.com/opentracing-contrib/java-jdbc
 - io.quarkus:io.quarkus.gradle.plugin [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
 - io.quarkus:quarkus-arc [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-arc-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-config-yaml [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-config-yaml-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-core-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-flyway [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-flyway-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-hibernate-orm-panache [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-hibernate-orm-panache-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-hibernate-validator [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-hibernate-validator-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-jdbc-postgresql [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-jdbc-postgresql-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-junit5 [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-resteasy-jsonb [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-resteasy-jsonb-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-jwt [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-jwt-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-metrics [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-metrics-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-openapi [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-openapi-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-opentracing [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-opentracing-deployment [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus
 - io.quarkus.platform:quarkus-bom [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
     https://github.com/quarkusio/quarkus-platform
 - io.rest-assured:rest-assured [4.5.1 -&amp;gt; 5.3.0]
     http://code.google.com/p/rest-assured
 - org.testcontainers:postgresql [1.17.5 -&amp;gt; 1.17.6]
     https://testcontainers.org

Gradle release-candidate updates:
 - Gradle: [7.6: UP-TO-DATE] 
------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Nesse caso, removi os logs referentes aos demais subprojetos só para termos um resultado menor.&lt;/p&gt;

&lt;p&gt;Podemos ver por exemplo que as seguintes dependências estão atualizadas no nosso projeto:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;The following dependencies are using the latest milestone version:
  - com.approvaltests:approvaltests:18.5.0
  - com.github.database-rider:rider-cdi:1.35.0
  - com.github.database-rider:rider-core:1.35.0
  - com.google.code.gson:gson:2.10
  - org.mapstruct:mapstruct:1.5.3.Final
  - org.mapstruct:mapstruct-processor:1.5.3.Final
  - stax:stax:1.2.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;E que a dependência do &lt;strong&gt;opentracing-jdbc&lt;/strong&gt; está desatualizada:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The following dependencies have later milestone versions:
  - io.opentracing.contrib:opentracing-jdbc [0.2.4 -&amp;gt; 0.2.15]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No entanto, temos um efeito colateral da forma como o plugin está funcionando. E isso pode ser visto em todas as dependências do &lt;strong&gt;Quarkus&lt;/strong&gt; que estamos usando, a sugestão de atualização para versão &lt;strong&gt;3.0.0.Alpha2&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  - io.quarkus:io.quarkus.gradle.plugin [2.14.3.Final -&amp;gt; 3.0.0.Alpha2]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Na maioria das vezes não queremos bibliotecas de &lt;strong&gt;Release&lt;/strong&gt;, &lt;strong&gt;Alpha&lt;/strong&gt; ou &lt;strong&gt;Beta&lt;/strong&gt; no nosso projeto por não serem versões finais, e poderem conter alterações futuras. Para resolver esse problema, o próprio plugin nos oferece uma solução em suas configurações. No nosso caso, podemos encontrar elas em &lt;strong&gt;plugins/docs.gradle&lt;/strong&gt;; eu havia comentado elas para evidenciar o problema anterior:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s2"&gt;"com.github.ben-manes.versions"&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;dependencyUpdates&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;checkForGradleUpdate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="n"&gt;outputFormatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"json"&lt;/span&gt;
    &lt;span class="n"&gt;outputDir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"build/reports/docs/dependencyUpdates"&lt;/span&gt;
    &lt;span class="n"&gt;reportfileName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"report"&lt;/span&gt;

    &lt;span class="n"&gt;resolutionStrategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;componentSelection&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;rules&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;ComponentSelection&lt;/span&gt; &lt;span class="n"&gt;selection&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;rejected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"alpha"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"beta"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rc"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"cr"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"m"&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;any&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;qualifier&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                    &lt;span class="n"&gt;selection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;candidate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;version&lt;/span&gt; &lt;span class="o"&gt;==~&lt;/span&gt; &lt;span class="s"&gt;/(?i).*[.-]${qualifier}[.\d-]*/&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rejected&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;selection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Release candidate"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Executando novamente a task, nosso resultado para &lt;strong&gt;:applications:cadastro&lt;/strong&gt; é o seguinte:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./gradlew dependencyUpdates

------------------------------------------------------------
:applications:cadastro Project Dependency Updates (report to plain text file)
------------------------------------------------------------

The following dependencies are using the latest milestone version:
 - com.approvaltests:approvaltests:18.5.0
 - com.github.database-rider:rider-cdi:1.35.0
 - com.github.database-rider:rider-core:1.35.0
 - com.google.code.gson:gson:2.10
 - io.quarkus.platform:quarkus-bom:2.14.3.Final
 - org.mapstruct:mapstruct:1.5.3.Final
 - org.mapstruct:mapstruct-processor:1.5.3.Final
 - stax:stax:1.2.0

The following dependencies have later milestone versions:
 - io.opentracing.contrib:opentracing-jdbc [0.2.4 -&amp;gt; 0.2.15]
     https://github.com/opentracing-contrib/java-jdbc
 - io.quarkus:io.quarkus.gradle.plugin [2.14.3.Final -&amp;gt; 2.15.0.Final]
 - io.quarkus:quarkus-arc [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-arc-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-config-yaml [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-config-yaml-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-core-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-flyway [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-flyway-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-hibernate-orm-panache [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-hibernate-orm-panache-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-hibernate-validator [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-hibernate-validator-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-jdbc-postgresql [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-jdbc-postgresql-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-junit5 [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-resteasy-jsonb [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-resteasy-jsonb-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-jwt [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-jwt-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-metrics [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-metrics-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-openapi [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-openapi-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-opentracing [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.quarkus:quarkus-smallrye-opentracing-deployment [2.14.3.Final -&amp;gt; 2.15.0.Final]
     https://github.com/quarkusio/quarkus
 - io.rest-assured:rest-assured [4.5.1 -&amp;gt; 5.3.0]
     http://code.google.com/p/rest-assured
 - org.testcontainers:postgresql [1.17.5 -&amp;gt; 1.17.6]
     https://testcontainers.org

Gradle release-candidate updates:
 - Gradle: [7.6: UP-TO-DATE]

------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Problema de atualização de bibliotecas resolvido? É só ir no nosso &lt;strong&gt;gradle.properties&lt;/strong&gt; e pronto.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://giphy.com/gifs/ionedigital-hellobeautiful-madamenoire-listen-to-black-women-NlXJKUUSnkN5BsOtl0" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia2.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExeDYzN3I5d3pvcHdsdWtwa2dmanhrMm9meDNpMnV5dmJkdW54ZWh2aCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FNlXJKUUSnkN5BsOtl0%2Fgiphy.webp" height="270" class="m-0" width="480"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://giphy.com/gifs/ionedigital-hellobeautiful-madamenoire-listen-to-black-women-NlXJKUUSnkN5BsOtl0" rel="noopener noreferrer" class="c-link"&gt;
          Americas Got Talent What GIF by iOne Digital - Find &amp;amp; Share on GIPHY
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Discover &amp;amp; share this Americas Got Talent What GIF by iOne Digital with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiphy.com%2Fstatic%2Fimg%2Ffavicon.png" width="16" height="16"&gt;
        giphy.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;O que fizemos foi apenas uma forma de evidenciar quais as bibliotecas que estão desatualizadas. &lt;/p&gt;

&lt;p&gt;Antes de mudar as versões de todas as que estão aparecendo como desatualizadas é importante validarmos se isso não impacta as outras bibliotecas do nosso projeto. Em muitos casos, uma biblioteca utiliza outras bibliotecas, o que chamamos de &lt;strong&gt;dependências transitivas&lt;/strong&gt;. Com isso, para que uma biblioteca funcione corretamente é importante que suas &lt;strong&gt;dependências transitivas&lt;/strong&gt; também estejam.&lt;/p&gt;

&lt;p&gt;Pegue por exemplo a &lt;a href="https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa" rel="noopener noreferrer"&gt;Spring Boot Starter Data JPA&lt;/a&gt;. Não vou me lembrar da versão exata, mas o &lt;strong&gt;Java teve uma grande mudança na versão 8&lt;/strong&gt;, dentre elas, a adição de &lt;strong&gt;Optional&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Me lembro quando utilizei o plugin de versões para mudar a versão do &lt;strong&gt;Spring Boot&lt;/strong&gt; em um outro projeto que eu estava trabalhando há alguns anos atrás, e de repente minhas classes de service começaram a dar problema. Ao investigar, percebi que a assinatura de alguns métodos mudaram, e ao invés de retornar uma entidade, estavam retornando &lt;strong&gt;Optional&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nesse caso em específico, eu consegui mudar o meu código para que a atualização fizesse sentido, mas imagina se o problema fosse em uma classe de &lt;strong&gt;dependência transitiva&lt;/strong&gt; que temos no projeto.&lt;/p&gt;

&lt;p&gt;Como então resolver o problema de saber se a atualização de uma dependência impacta ou não outras dependências, e consequentemente o projeto? Podemos ir na tentativa e erro, subindo nossa aplicação e vendo se todos os fluxos dela continuam funcionando. Mas será que não tem uma forma melhor?&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuous Integration
&lt;/h3&gt;

&lt;p&gt;Em posts mais adiante falaremos sobre &lt;a href="https://about.gitlab.com/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt; e pipelines. Quando falarmos sobre pipelines discorreremos sobre a importância do processo de automação dado o número de alterações de um projeto por várias pessoas.&lt;/p&gt;

&lt;p&gt;Uma forma que poderíamos fazer seria então termos a nossa fase de testes executada em nossa pipeline sempre que um &lt;strong&gt;merge request&lt;/strong&gt; for realizado, por exemplo.&lt;/p&gt;

&lt;p&gt;Podemos agora fazer mudanças em versões de uma biblioteca e ver se nossos testes não quebram. Para essa abordagem é importante que &lt;strong&gt;confiemos nos nossos testes&lt;/strong&gt; e na &lt;strong&gt;quantidade de camadas cobertas por eles&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quando digo em confiar em nossos testes, me refiro aos seguintes testes que muitas vezes encontramos em nossos projetos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.quarkus.test.junit.QuarkusTest&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.junit.jupiter.api.Assertions&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.junit.jupiter.api.Test&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@QuarkusTest&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Teste&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;adicao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveAdicionar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Assertions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;assertNotNull&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adicao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;O teste com &lt;strong&gt;assertNotNull&lt;/strong&gt; pode nos dar um falso positivo sobre o funcionamento do nosso método. Imagine por exemplo que um desenvolvedor subiu uma versão mudando o método para algo como:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;adicao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Nosso teste não iria quebrar! Bem importante usar testes com &lt;strong&gt;assertNotNull&lt;/strong&gt; com parcimônia.&lt;/p&gt;

&lt;p&gt;Esse foi apenas um exemplo de teste que poderia ser melhor testado, mas imagina se fizermos testes que não quebrem, porém, quando fizermos o deploy em produção aparecerem incompatibilidades.&lt;/p&gt;

&lt;p&gt;Uma abordagem que podemos seguir para saber se temos bons testes foi escrita por &lt;a class="mentioned-user" href="https://dev.to/alexandreaquiles"&gt;@alexandreaquiles&lt;/a&gt;:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.alura.com.br/artigos/testes-de-mutantes" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.alura.com.br%2Fartigos%2Fassets%2Ftestes-de-mutantes%2Fmutantes-2.png" height="446" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.alura.com.br/artigos/testes-de-mutantes" rel="noopener noreferrer" class="c-link"&gt;
          Testes de mutantes: quem vigia os vigilantes? | Alura
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
           Quis custodiet ipsos custodes? - Decimus Junius Juvelanis A frase acima, do poeta romano Juvelanis, é geralmente traduzida como: &amp;amp;quot;Quem vigia os vigilant
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.alura.com.br%2Fassets%2Ffavicon.1730889067.ico" width="800" height="800"&gt;
        alura.com.br
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Mas voltando à atualização das nossas bibliotecas, não seria maravilhoso se tivesse uma forma melhor do que nós mesmos abrirmos &lt;strong&gt;merges request&lt;/strong&gt; para cada mudança?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0j2ve9pojff9vph99bj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0j2ve9pojff9vph99bj.jpg" alt="Não seria maravilho se...?" width="303" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependabot
&lt;/h3&gt;

&lt;p&gt;O &lt;a href="https://dependabot-gitlab.gitlab.io/dependabot/" rel="noopener noreferrer"&gt;Dependabot&lt;/a&gt; é uma solução que funciona com &lt;strong&gt;Ruby&lt;/strong&gt;, &lt;strong&gt;JavaScript&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;PHP&lt;/strong&gt;, &lt;strong&gt;Elixir&lt;/strong&gt;, &lt;strong&gt;Elm&lt;/strong&gt;, &lt;strong&gt;Go&lt;/strong&gt;, &lt;strong&gt;Rust&lt;/strong&gt;, &lt;strong&gt;Java&lt;/strong&gt; e &lt;strong&gt;.NET&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E seu funcionamento se dá em uma constante validação de novas versões e abertura de &lt;strong&gt;merge requests&lt;/strong&gt; para um repositório configurado. Não configurei nesse projeto, mas vocês podem ver a ideia dele &lt;a href="https://github.com/arthurfnsc/bands-REST-api/pulls?q=is%3Apr+is%3Aopen+label%3Adependencies" rel="noopener noreferrer"&gt;nesse outro repositório&lt;/a&gt; que criei.&lt;/p&gt;

&lt;p&gt;Com isso, é possível aprovar ou não os &lt;strong&gt;merge requests&lt;/strong&gt; que o &lt;strong&gt;Dependabot&lt;/strong&gt; fará para o nosso projeto.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A atualização de dependências de um projeto é um processo que poderá ser necessário em projetos, porém é importante avaliarmos os impactos das mesmas e consequências em outras bibliotecas do projeto.&lt;/p&gt;

&lt;p&gt;Soluções como &lt;a href="https://github.com/ben-manes/gradle-versions-plugin" rel="noopener noreferrer"&gt;Gradle Versions Plugin&lt;/a&gt; ou &lt;a href="https://dependabot-gitlab.gitlab.io/dependabot/" rel="noopener noreferrer"&gt;Dependabot&lt;/a&gt; podem fazer parte do nosso processo para uma maior assertividade na alterações de tais versões, atrelados a processos como &lt;strong&gt;Continuous Integration&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse post faz parte de uma série sobre &lt;strong&gt;Cursos que formaram meu caráter: Desenvolvimento web com Quarkus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A série completa é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-talk-is-cheap-show-me-the-code-2k91"&gt;Talk is cheap show me the code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn"&gt;Utilizando Gradle ao invés de Maven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: Gerenciador de versões de bibliotecas com Versions&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-saudades-do-maven-relatorios-com-project-report-51d6"&gt;Plugins do Gradle: Saudades do  Maven, relatórios com Project-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm"&gt;Plugins do Gradle: API First com o OpenAPI Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-para-apis-reativas-3o9b"&gt;Plugins do Gradle: API First com o OpenAPI Generator para APIs reativas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-validacao-de-vulnerabilidades-com-owasp-dependency-check-2a2l"&gt;Plugins do Gradle: Validação de vulnerabilidades de dependências com OWASP Dependency Check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: Lint com Spotless [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Motivação para a escolha [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Considerações sobre o Prettier em pipelines [não publicado]&lt;/li&gt;
&lt;li&gt;Gitmoji [não publicado]&lt;/li&gt;
&lt;li&gt;SDK Man [não publicado]&lt;/li&gt;
&lt;li&gt;Pré commit hook [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando YML em propriedades de aplicação [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando variáveis de ambiente [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Sobrescrevendo opções em teste [não publicado]&lt;/li&gt;
&lt;li&gt;Mapstruct: Utilizando expressões para mapeamentos [não publicado]&lt;/li&gt;
&lt;li&gt;Microprofile SecurityScheme: Sobrescrevendo tokenUrl [não publicado]&lt;/li&gt;
&lt;li&gt;Prometheus: O problema simples que me custou algumas horas [não publicado]&lt;/li&gt;
&lt;li&gt;quarkus-hibernate-reactive-panache: Utilizando as vantagens do Hibernate em projetos reativos [não publicado]&lt;/li&gt;
&lt;li&gt;Testcontainers: Configuração para projetos reativos [não publicado]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gradle</category>
      <category>java</category>
      <category>benmanes</category>
      <category>dependabot</category>
    </item>
    <item>
      <title>Cursos que formaram meu caráter: Utilizando Gradle ao invés de Maven</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Mon, 12 Dec 2022 20:01:24 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn</link>
      <guid>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"Pois as coisas que temos de aprender antes de podermos fazê-las, aprendemos fazendo-as." Aristóteles&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse segundo posts falaremos sobre o &lt;a href="https://gradle.org/"&gt;Gradle&lt;/a&gt;, uma ferramenta de automação que ajuda no gerenciamento de ciclo de vida de projetos. Vantagens, desvantagens e motivos que me fizeram mudar o projeto de &lt;a href="https://maven.apache.org/"&gt;Maven&lt;/a&gt; para Gradle.&lt;/p&gt;

&lt;p&gt;Esse artigo faz parte de uma série, abaixo é possível encontrar a lista completa de artigos.&lt;/p&gt;

&lt;p&gt;Estamos nos baseando no curso &lt;a href="https://www.udemy.com/course/des-web-quarkus"&gt;Desenvolvimento web com Quarkus&lt;/a&gt; do &lt;a class="mentioned-user" href="https://dev.to/viniciusfcf"&gt;@viniciusfcf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O repositório em que estamos nos baseando é:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Eo8_psp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gitlab.com/assets/twitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" height="880" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" rel="noopener noreferrer" class="c-link"&gt;
          udemy / Desenvolvimento Web com Quarkus / ifood · GitLab
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          GitLab.com
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Sy_zlNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gitlab.com/assets/favicon-72a2cad5025aa931d6ea56c3201d1f18e68a8cd39788c7c80d5b2b82aa5143ef.png" width="32" height="32"&gt;
        gitlab.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Gradle 101 — History so far…
&lt;/h2&gt;

&lt;p&gt;Como a maioria dos desenvolvedores Java que conheço, iniciei minha vida utilizando o &lt;strong&gt;Maven&lt;/strong&gt;. Eu ficava maravilhado com todo aquele &lt;strong&gt;XML&lt;/strong&gt; que eu poderia utilizar para gerenciar meu projeto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V1VPAGSD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7q4qb7nwicymex0yb764.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V1VPAGSD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7q4qb7nwicymex0yb764.jpg" alt="Sarcasm" width="880" height="741"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Foi então que em 11 de Novembro de 2016, um commit simples foi um marco fundamental na minha carreira:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Atualização de arquitetura de projeto para Gradle”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Naquela época eu trabalhava em um instituto de pesquisas, o &lt;a href="https://www.ibti.org.br/"&gt;IBTI&lt;/a&gt;, e &lt;a class="mentioned-user" href="https://dev.to/felipebelluco"&gt;@felipebelluco&lt;/a&gt; uma vez veio me perguntar se eu estava a fim de conhecer "umas coisas diferenciadas".&lt;/p&gt;

&lt;p&gt;Ele trabalhava com Android, mas me falou que era possível utilizar &lt;strong&gt;Gradle&lt;/strong&gt; em projetos de backend. Em um instituto de pesquisas o que você tem que fazer é experimentar coisas, e lá fui eu; algo semelhante ao que escrevi em um post sobre &lt;a href="https://dev.to/arthurfnsc/paul-arden-pensando-ao-contrario-parte-2-experimentando-coisas-novas-mesmo-nao-gostando-inicialmente-35kc"&gt;Paul Arden e experimentar coisas novas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Parti da seguinte premissa: se isso vai "substituir" o &lt;strong&gt;Maven&lt;/strong&gt;, precisa fazer o que ele faz; então, de posse de um projeto &lt;strong&gt;Maven&lt;/strong&gt; criei um &lt;strong&gt;build.gradle&lt;/strong&gt; e tentei a compilação do projeto até que ele funcionasse como funcionava o meu &lt;strong&gt;pom.xml&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Na real, para a galera não vir aqui falando que eu sou “modinha”, meu ponto é basicamente o seguinte: é mais que obrigação de alguém que chega depois e, estuda os problemas que um dado player resolve, analisar os gaps e se propor a fazer melhor.&lt;/p&gt;

&lt;p&gt;A timeline de ferramentas de gerenciamento de ciclo de vida de projetos no mundo Java foi mais do que uma troca entre &lt;strong&gt;Maven&lt;/strong&gt; e &lt;strong&gt;Gradle&lt;/strong&gt;, e pode ser detalhada como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2000 — &lt;strong&gt;Another Neat Tool&lt;/strong&gt; (sim… a formiguinha (&lt;a href="https://ant.apache.org/"&gt;ANT&lt;/a&gt;) é só um acrônimo… obrigado, de nada)&lt;/li&gt;
&lt;li&gt;2002 — Maven&lt;/li&gt;
&lt;li&gt;2005 — &lt;a href="https://ant.apache.org/ivy/"&gt;Ivy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;2007 — &lt;a href="https://github.com/codehaus/gant"&gt;Gant&lt;/a&gt; (Sim… tentaram reviver o ANT)&lt;/li&gt;
&lt;li&gt;2007 — Gradle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aVRVJVo8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kjvh6eb71rmlrtw4ul1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aVRVJVo8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kjvh6eb71rmlrtw4ul1g.png" alt="Influência Gradle" width="819" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não consegui achar de onde peguei a imagem, mas creio que foi do próprio &lt;strong&gt;Gradle&lt;/strong&gt; em uns treinamentos gratuitos deles que eu fiz, que &lt;strong&gt;são muito bons, diga-se de passagem&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://gradle.com/training/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--gyRIu_Pj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gradle.com/wp-content/uploads/2022/03/gradle-enterprise-social-large.png" height="495" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://gradle.com/training/" rel="noopener noreferrer" class="c-link"&gt;
          
          Trainings | Gradle Enterprise
      
        &lt;/a&gt;
      &lt;/h2&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--57lb50aF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gradle.com/wp-content/themes/fuel/assets/favicon/favicon-32x32.png" width="32" height="32"&gt;
        gradle.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;É muito fácil olhar para o &lt;strong&gt;Maven&lt;/strong&gt; hoje e pensar que existem outras formas de fazer as coisas. Para o problema que tínhamos, o &lt;strong&gt;Maven&lt;/strong&gt; era e continua sendo uma excelente solução.&lt;/p&gt;

&lt;p&gt;E que problema era esse? &lt;/p&gt;

&lt;p&gt;Como versionar dependências que usamos no projeto para não ficarmos com projetos grandes demais (imagina versionar os &lt;strong&gt;JARs&lt;/strong&gt; de um projeto...)? Além disso, como criar nossos scripts para facilitar isso?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XML&lt;/strong&gt; tinha a vantagem de manter uma estrutura baseada em um &lt;strong&gt;XML Schema Definition&lt;/strong&gt; (&lt;strong&gt;XSD&lt;/strong&gt;) para a gente. Com isso, aproveitamos da vantagem de padronização de estrutura proporcionada pelo nosso arquivo &lt;strong&gt;pom.xml&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para quem não sabe, aquelas primeiras linhas do &lt;strong&gt;pom.xml&lt;/strong&gt; são muito importantes por definirem a estrutura do nosso arquivo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;project&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/POM/4.0.0"&lt;/span&gt; &lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;
    &lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Já pensou em seguir o seguinte link &lt;a href="https://maven.apache.org/xsd/maven-4.0.0.xsd"&gt;https://maven.apache.org/xsd/maven-4.0.0.xsd&lt;/a&gt; do &lt;strong&gt;schemaLocation&lt;/strong&gt;?&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://giphy.com/gifs/stress-i-need-a-drink-brain-explode-2rqEdFfkMzXmo" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--YSIEqQpu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media1.giphy.com/media/2rqEdFfkMzXmo/giphy.gif%3Fcid%3D790b76119151b230598c59eb787af458ed5597a62d06eb12%26rid%3Dgiphy.gif%26ct%3Dg" height="300" class="m-0" width="499"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://giphy.com/gifs/stress-i-need-a-drink-brain-explode-2rqEdFfkMzXmo" rel="noopener noreferrer" class="c-link"&gt;
          Stress I Need A Drink GIF - Find &amp;amp; Share on GIPHY
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Discover &amp;amp; share this Stress GIF with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--EnkhlOxW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://giphy.com/static/img/favicon.png" width="16" height="16"&gt;
        giphy.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Nesse arquivo você consegue ver cada tag do &lt;strong&gt;pom.xml&lt;/strong&gt;, bem como a quantidade mínima e máxima de repetições delas e que outras tags podem ser contidas dentro.&lt;/p&gt;

&lt;p&gt;Nesse ponto, cheguei à conclusão que a discussão entre &lt;strong&gt;Maven&lt;/strong&gt; e &lt;strong&gt;Gradle&lt;/strong&gt; depende de uma série de fatores. Ainda que o &lt;strong&gt;Gradle&lt;/strong&gt; tenha uma página dedicada apenas a essa comparação, outros fatores também são importantes para a decisão: profissionais que trabalham com cada uma das frentes, como definir uma arquitetura corporativa, quantidade de plugins, dentre outras.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://gradle.org/maven-vs-gradle/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--TS2IXdK4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gradle.org/images/gradle-400x400.png" height="400" class="m-0" width="400"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://gradle.org/maven-vs-gradle/" rel="noopener noreferrer" class="c-link"&gt;
          Gradle | Gradle vs Maven Comparison
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          High-level performance and feature comparison between Gradle and Maven
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--BAGAldjp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gradle.org/icon/favicon-32x32.png" width="32" height="32"&gt;
        gradle.org
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Já conversei com arquitetos que não viam vantagem de poder programar em ferramentas de build, com o &lt;strong&gt;Gradle&lt;/strong&gt;. Hoje é possível ter essa parte em &lt;strong&gt;Groovy&lt;/strong&gt; ou &lt;strong&gt;Kotlin&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Enfim… creio que fica muito mais como uma escolha de cada um… nesse post a ideia é mostrar as vantagens de se aplicar &lt;strong&gt;Gradle&lt;/strong&gt; no nosso projeto, e como pensei para fazê-lo.&lt;/p&gt;

&lt;p&gt;E para quem acha que o &lt;strong&gt;Gradle&lt;/strong&gt; está restrito à &lt;strong&gt;JVM&lt;/strong&gt;, segue a seguinte informação do &lt;a href="https://gradle.org/"&gt;próprio site deles&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write in Java, C++, Python or your language of choice. Package for deployment on any platform. Go monorepo or multi-repo. And rely on Gradle’s unparalleled versatility to build it all.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Gradle ao invés de Maven, o que muda?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Wrapper
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;gradlew&lt;/strong&gt; e &lt;strong&gt;gradlew.bat&lt;/strong&gt;, esses são dois caras que muitas pessoas têm em seus projetos e não sabem para que servem. Para quem usa &lt;strong&gt;Maven&lt;/strong&gt; temos o &lt;strong&gt;mvnw&lt;/strong&gt; e o &lt;strong&gt;mvnw.cmd&lt;/strong&gt; também.&lt;/p&gt;

&lt;p&gt;O projeto foi concebido para que a instalação do &lt;strong&gt;Gradle fosse opcional&lt;/strong&gt;, para tanto, é possível rodar as configurações do projeto após instalação do Java pelos arquivos &lt;strong&gt;gradle.bat&lt;/strong&gt; em sistemas &lt;strong&gt;Windows&lt;/strong&gt; e &lt;strong&gt;gradlew&lt;/strong&gt; em sistemas &lt;strong&gt;Unix&lt;/strong&gt;, que interagem com o arquivo &lt;strong&gt;gradle-wrapper.jar&lt;/strong&gt; contido na pasta &lt;strong&gt;gradle/wrapper&lt;/strong&gt; na raiz do projeto.&lt;/p&gt;

&lt;p&gt;No arquivo &lt;strong&gt;build.gradle&lt;/strong&gt; na raiz do projeto é possível encontrar o seguinte bloco de código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;wrapper&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gradleVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$gradleWrapperVersion"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;$gradleWrapperVersion&lt;/strong&gt; refere-se a uma variável do projeto escrita no arquivo &lt;strong&gt;gradle.properties&lt;/strong&gt;, neste caso, a versão que estamos usando é a &lt;strong&gt;7.6&lt;/strong&gt;. Caso haja uma alteração de versão no &lt;strong&gt;Gradle&lt;/strong&gt; é possível alterar a variável &lt;strong&gt;$gradleWrapperVersion&lt;/strong&gt; e executar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;foo@bar:~&lt;span class="nv"&gt;$ &lt;/span&gt;./gradlew wrapper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso atualizará o &lt;strong&gt;gradle-wrapper.jar&lt;/strong&gt; contido na pasta &lt;strong&gt;gradle/wrapper&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variáveis de projeto
&lt;/h3&gt;

&lt;p&gt;A utilização de variáveis de projeto vão estar presentes em todo o projeto, desde plugins:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s2"&gt;"com.diffplug.spotless"&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="s2"&gt;"$spotlessVersion"&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s2"&gt;"com.github.ben-manes.versions"&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="s2"&gt;"$versionsVersion"&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s2"&gt;"java"&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s2"&gt;"org.openapi.generator"&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="s2"&gt;"$openApiGenVersion"&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s2"&gt;"org.owasp.dependencycheck"&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="s2"&gt;"$dependencyCheckVersion"&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Até dependências:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="nf"&gt;enforcedPlatform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;annotationProcessor&lt;/span&gt; &lt;span class="s2"&gt;"org.mapstruct:mapstruct-processor:$mapstructVersion"&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mapstruct&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quarkus&lt;/span&gt;
    &lt;span class="n"&gt;testImplementation&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Agrupando dependências
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;Gradle&lt;/strong&gt; possui um mecanismo bem interessante de reaproveitamento de código, como por baixo possuímos uma linguagem de programação, no nosso caso, usei o &lt;a href="https://groovy-lang.org/"&gt;Groovy&lt;/a&gt;, mas já é possível usar o &lt;a href="https://kotlinlang.org/"&gt;Kotlin&lt;/a&gt; (apesar de eu ainda não ter visto grande vantagem em mudar de Groovy para Kotlin, mas isso vai ser tema para outro post, quando eu experimentar substituir o Groovy por Kotlin em um novo projeto).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;libs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;quarkus&lt;/span&gt;  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"io.quarkus:quarkus-arc"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"io.quarkus:quarkus-config-yaml"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"io.quarkus:quarkus-flyway"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"io.quarkus:quarkus-jdbc-postgresql"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"io.quarkus:quarkus-smallrye-openapi"&lt;/span&gt;
    &lt;span class="o"&gt;],&lt;/span&gt;
    &lt;span class="nl"&gt;mapstruct:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"org.mapstruct:mapstruct:$mapstructVersion"&lt;/span&gt;
    &lt;span class="o"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt;     &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
       &lt;span class="s2"&gt;"com.approvaltests:approvaltests:$approvalTestsVersion"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"com.google.code.gson:gson"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"io.quarkus:quarkus-junit5"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"io.rest-assured:rest-assured"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"org.testcontainers:postgresql:$testcontainersVersion"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"stax:stax:$staxVersion"&lt;/span&gt;
    &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desta forma é possível fazer o import de bibliotes da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mapstruct&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quarkus&lt;/span&gt;
    &lt;span class="n"&gt;testImplementation&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sabe aqueles imports que você precisava escrever linhas e linhas com o mesmo &lt;strong&gt;groupId&lt;/strong&gt; e &lt;strong&gt;version&lt;/strong&gt;? Pois bem, essa acho uma solução bem elegante para o problema; ela é uma evolução de uma outra abordagem que eu usava antes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;
&lt;span class="n"&gt;ext&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;kotlinVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'1.3.31'&lt;/span&gt;
    &lt;span class="n"&gt;kotlinArtifacts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'kotlin-allopen'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'kotlin-noarg'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'kotlin-gradle-plugin'&lt;/span&gt;
    &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;kotlinArtifacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"org.jetbrains.kotlin:$a:$kotlinVersion"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima estamos fazendo um &lt;strong&gt;forEach&lt;/strong&gt; para cada artefato contido no &lt;strong&gt;Array kotlinArtifacts&lt;/strong&gt; e utilizando o &lt;strong&gt;implementation&lt;/strong&gt; com o mesmo &lt;strong&gt;groupId org.jetbrains.kotlin&lt;/strong&gt; (vantagens de se utilizar uma linguagem de programação).&lt;/p&gt;

&lt;p&gt;Nesse segundo exemplo é possível ver uma coisa bem interessante, a diferença entre &lt;strong&gt;aspas simples&lt;/strong&gt; e &lt;strong&gt;aspas duplas&lt;/strong&gt; para o &lt;strong&gt;Groovy&lt;/strong&gt;. Resumindo, com aspas duplas é possível fazer interpolação de String, e com isso fazer a substituição da variável &lt;strong&gt;$kotlinVersion&lt;/strong&gt; quando da implementation de um artefato. Teríamos algo como o seguinte ao final do nosso &lt;strong&gt;forEach&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"org.jetbrains.kotlin:kotlin-allopen:1.3.31"&lt;/span&gt;
&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"org.jetbrains.kotlin:kotlin-noarg:1.3.31"&lt;/span&gt;
&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Definições externas
&lt;/h3&gt;

&lt;p&gt;Uma das coisas que acho mais fera no &lt;strong&gt;Gradle&lt;/strong&gt; é a possibilidade de separar configurações em mais de um lugar, utilizando o princípio de &lt;a href="https://en.wikipedia.org/wiki/Separation_of_concerns"&gt;Separation of Concerns&lt;/a&gt; e o &lt;a href="https://en.wikipedia.org/wiki/Single-responsibility_principle"&gt;Simple Responsability Principle&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;subprojects&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;'applications'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s2"&gt;"java"&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/java.gradle"&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/docs.gradle"&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/lint.gradle"&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/mapstruct.gradle"&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/security.gradle"&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro da raiz do projeto é possível perceber a pasta &lt;strong&gt;plugins&lt;/strong&gt;, lá estão definidas as configurações que estou usando referentes a Java, documentação de projeto, Lint, MapStruct e segurança. Em postagens futuras falaremos sobre cada um deles.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;build.gradle&lt;/strong&gt; fica muito mais limpo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi project Gradle
&lt;/h3&gt;

&lt;p&gt;Como no &lt;strong&gt;Maven&lt;/strong&gt;, é possível trabalhar com multi-projetos no &lt;strong&gt;Gradle&lt;/strong&gt;. Particularmente nesse ponto acho o &lt;strong&gt;Maven&lt;/strong&gt; um pouco melhor, bem como na parte de definição de &lt;strong&gt;Parent-Project&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O grande pulo do gato para o &lt;strong&gt;Gradle&lt;/strong&gt; vai estar no arquivo &lt;strong&gt;settings.gradle&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;rootProject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ifood"&lt;/span&gt;

&lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s2"&gt;"applications:cadastro"&lt;/span&gt;
&lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s2"&gt;"applications:marketplace"&lt;/span&gt;
&lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s2"&gt;"applications:pedido"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Preferi agrupar todos os projetos dentro de uma pasta chamada &lt;strong&gt;applications&lt;/strong&gt;. Como utilizo outras pastas para configurações (configs) e plugins, achei melhor agrupar uma pasta com os códigos em Java.&lt;/p&gt;

&lt;p&gt;Essa configuração já é o suficiente para termos os subprojetos vinculados.&lt;/p&gt;

&lt;h3&gt;
  
  
  subprojects
&lt;/h3&gt;

&lt;p&gt;Com o &lt;strong&gt;Gradle&lt;/strong&gt; é possível definir de uma forma global configurações que serão utilizadas para todo o projeto e/ou para os subprojetos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;subprojects&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;'applications'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s2"&gt;"java"&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/java.gradle"&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/docs.gradle"&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/lint.gradle"&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/mapstruct.gradle"&lt;/span&gt;
        &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/security.gradle"&lt;/span&gt;

        &lt;span class="n"&gt;repositories&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;mavenCentral&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;mavenLocal&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="nf"&gt;enforcedPlatform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;annotationProcessor&lt;/span&gt; &lt;span class="s2"&gt;"org.mapstruct:mapstruct-processor:$mapstructVersion"&lt;/span&gt;
            &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mapstruct&lt;/span&gt;
            &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quarkus&lt;/span&gt;
            &lt;span class="n"&gt;testImplementation&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;useJUnitPlatform&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;maxParallelForks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
            &lt;span class="n"&gt;testLogging&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;displayGranularity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
                &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"FAILED"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"SKIPPED"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;systemProperty&lt;/span&gt; &lt;span class="s2"&gt;"java.util.logging.manager"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"org.jboss.logmanager.LogManager"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E caso precisemos de configurações específicas em um subprojeto é possível utilizar a seguinte estratégia contida em &lt;strong&gt;applications/cadastro/build.gradle&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s2"&gt;"io.quarkus"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="s2"&gt;"com.gitlab.arthurfnsc.ifood"&lt;/span&gt;
&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="s2"&gt;"1.0.0-SNAPSHOT"&lt;/span&gt;

&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/openapigen_cadastro.gradle"&lt;/span&gt;

&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"io.opentracing.contrib:opentracing-jdbc"&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"io.quarkus:quarkus-hibernate-orm-panache"&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"io.quarkus:quarkus-hibernate-validator"&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"io.quarkus:quarkus-resteasy-jsonb"&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"io.quarkus:quarkus-smallrye-jwt"&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"io.quarkus:quarkus-smallrye-metrics"&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"io.quarkus:quarkus-smallrye-opentracing"&lt;/span&gt;
    &lt;span class="n"&gt;testImplementation&lt;/span&gt; &lt;span class="s2"&gt;"com.github.database-rider:rider-cdi:$dbRiderVersion"&lt;/span&gt;
    &lt;span class="n"&gt;testImplementation&lt;/span&gt; &lt;span class="s2"&gt;"com.github.database-rider:rider-core:$dbRiderVersion"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse caso, além das dependências definidas no bloco &lt;strong&gt;subprojects&lt;/strong&gt; adicionamos dependências e um plugin específico.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A utilização de &lt;strong&gt;Gradle&lt;/strong&gt; foi uma escolha minha e em nada impacta no curso criado pelo &lt;a class="mentioned-user" href="https://dev.to/viniciusfcf"&gt;@viniciusfcf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apesar de uma série de vantagens propostas, sempre é importante analisar o contexto do projeto a ser desenvolvido, bem como a expertise da equipe para a definição de uma ou outra opção.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse post faz parte de uma série sobre &lt;strong&gt;Cursos que formaram meu caráter: Desenvolvimento web com Quarkus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A série completa é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-talk-is-cheap-show-me-the-code-2k91"&gt;Talk is cheap show me the code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Utilizando Gradle ao invés de Maven&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na"&gt;Plugins do Gradle: Gerenciador de versões de bibliotecas com Versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-saudades-do-maven-relatorios-com-project-report-51d6"&gt;Plugins do Gradle: Saudades do  Maven, relatórios com Project-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm"&gt;Plugins do Gradle: API First com o OpenAPI Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-para-apis-reativas-3o9b"&gt;Plugins do Gradle: API First com o OpenAPI Generator para APIs reativas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-validacao-de-vulnerabilidades-com-owasp-dependency-check-2a2l"&gt;Plugins do Gradle: Validação de vulnerabilidades de dependências com OWASP Dependency Check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: Lint com Spotless [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Motivação para a escolha [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Considerações sobre o Prettier em pipelines [não publicado]&lt;/li&gt;
&lt;li&gt;Gitmoji [não publicado]&lt;/li&gt;
&lt;li&gt;SDK Man [não publicado]&lt;/li&gt;
&lt;li&gt;Pré commit hook [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando YML em propriedades de aplicação [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando variáveis de ambiente [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Sobrescrevendo opções em teste [não publicado]&lt;/li&gt;
&lt;li&gt;Mapstruct: Utilizando expressões para mapeamentos [não publicado]&lt;/li&gt;
&lt;li&gt;Microprofile SecurityScheme: Sobrescrevendo tokenUrl [não publicado]&lt;/li&gt;
&lt;li&gt;Prometheus: O problema simples que me custou algumas horas [não publicado]&lt;/li&gt;
&lt;li&gt;quarkus-hibernate-reactive-panache: Utilizando as vantagens do Hibernate em projetos reativos [não publicado]&lt;/li&gt;
&lt;li&gt;Testcontainers: Configuração para projetos reativos [não publicado]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gradle</category>
      <category>groovy</category>
      <category>maven</category>
      <category>quarkus</category>
    </item>
    <item>
      <title>Cursos que formaram meu caráter: Desenvolvimento web com Quarkus - Talk is cheap show me the code</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Mon, 12 Dec 2022 06:20:41 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-talk-is-cheap-show-me-the-code-2k91</link>
      <guid>https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-talk-is-cheap-show-me-the-code-2k91</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;O preguiçoso muito quer e nada alcança. [Provérbios 13:4a]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Preciso confessar um problema que tenho: Acumulação de coisas digitais!&lt;/p&gt;

&lt;p&gt;O advento da era em que estamos nos proporcionou uma série de benefícios, como a disponibilidade de informações e conteúdos a "um clique de distância".&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://www.udemy.com" rel="noopener noreferrer"&gt;Udemy&lt;/a&gt;, por exemplo, é uma plataforma de ensino que permite o aprendizado de diversas ferramentas, frameworks, metodologias, dentre outras coisas. O que percebi dos meus estudos com ela, no entanto, é que eu não terminei 10% dos cursos que tenho. Muitas das vezes acabava com preguiça de finalizar um curso dado a máxima do término de projetos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwce1fy9sicape8fxa7mw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwce1fy9sicape8fxa7mw.jpg" alt="Término de projetos" width="500" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visando melhorar esses números, resolvi realizar os cursos e escrever insights dos mesmos, exercitando hard skills, bem como a escrita em português, inglês e espanhol.&lt;/p&gt;

&lt;p&gt;O curso que resolvi começar foi o curso &lt;a href="https://www.udemy.com/course/des-web-quarkus" rel="noopener noreferrer"&gt;Desenvolvimento web com Quarkus&lt;/a&gt; do &lt;a href="https://dev.to/viniciusfcf"&gt;Vínicius Ferraz Campos Florentino&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O código do curso do Vinícius se encontra no seu GitHub.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/viniciusfcf" rel="noopener noreferrer"&gt;
        viniciusfcf
      &lt;/a&gt; / &lt;a href="https://github.com/viniciusfcf/udemy-quarkus" rel="noopener noreferrer"&gt;
        udemy-quarkus
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Código apresentado no curso de desenvolvimento completo com Quarkus no Udemy
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Curso disponível na Udemy&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Código criado no curso de desenvolvimento Web com Quarkus no Udemy&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.udemy.com/course/draft/2935782/?referralCode=FB263DAFBC7707FFA058" rel="nofollow noopener noreferrer"&gt;Clique aqui e acesse o curso&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/viniciusfcf/udemy-quarkus" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;O código que irei apresentar se encontra no meu GitLab. Em um dos tópicos adiante explicarei a motivação da escolha do GitLab para versionamento de código.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgitlab.com%2Fassets%2Ftwitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" height="800" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/" rel="noopener noreferrer" class="c-link"&gt;
          udemy / Desenvolvimento Web com Quarkus / ifood · GitLab
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          GitLab.com
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgitlab.com%2Fassets%2Ffavicon-72a2cad5025aa931d6ea56c3201d1f18e68a8cd39788c7c80d5b2b82aa5143ef.png" width="32" height="32"&gt;
        gitlab.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Motivação
&lt;/h2&gt;

&lt;p&gt;Meu objetivo ao realizar o curso foi aplicar algumas alterações em sua estrutura e arquitetura, visando consolidar outros conhecimentos e técnicas que utilizo em projetos com Java e Kotlin na &lt;a href="https://ilia.digital/" rel="noopener noreferrer"&gt;ília Digital&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importante ressaltar que o que escreverei aqui não substitui o curso do Vinícius, nem tão pouco que o código apresentado no curso não alcançou seu objetivo de ensinar os alunos.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vários pontos referentes ao &lt;a href="//quarkus.io/"&gt;Quarkus&lt;/a&gt; são detalhados no curso do Vinícius, e não será foco desses artigos a explicação deles, como por exemplo: &lt;a href="https://flywaydb.org/" rel="noopener noreferrer"&gt;Flyway&lt;/a&gt;, &lt;a href="https://grafana.com/" rel="noopener noreferrer"&gt;Grafana&lt;/a&gt;, &lt;a href="https://www.keycloak.org/" rel="noopener noreferrer"&gt;Keycloak&lt;/a&gt;, dentre outros.&lt;/p&gt;

&lt;p&gt;Algumas das alterações, por exemplo, foram de evolução de versão de bibliotecas já que a última atualização do curso se deu em Outubro de 2020. Outras foram apenas escolhas arquiteturais minhas, como o conceito de API First com &lt;a href="https://github.com/OpenAPITools/openapi-generator" rel="noopener noreferrer"&gt;OpenAPI Generator&lt;/a&gt; e a utilização de &lt;a href="https://gradle.org/" rel="noopener noreferrer"&gt;Gradle&lt;/a&gt; ao invés de &lt;a href="https://maven.apache.org/" rel="noopener noreferrer"&gt;Maven&lt;/a&gt; que em nada desmerecem a solução utilizada pelo Vinícius. Para cada uma dessas escolhas mostrarei as vantagens e desvantagens.&lt;/p&gt;

&lt;p&gt;Sendo assim, recomendo a todos a realização do &lt;a href="https://www.udemy.com/course/des-web-quarkus" rel="noopener noreferrer"&gt;curso&lt;/a&gt; caso queiram uma visão sobre o Quarkus, bem como seguirem o &lt;a href="https://www.youtube.com/@ViniciusFerraz" rel="noopener noreferrer"&gt;canal do YouTube do Vinícius&lt;/a&gt; para mais novidades sobre o framework. Um dos últimos vídeos dele sobre &lt;a href="https://camel.apache.org/" rel="noopener noreferrer"&gt;Apache Camel&lt;/a&gt; está na minha lista de vídeos para ver.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/om-FmStZBPo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Isso me lembrou um post do &lt;a href="https://dev.to/mariorez"&gt;Mário Rezende&lt;/a&gt; no Linkedin, e para variar que também tenho três cursos da Udemy de Camel que ainda não fiz ahahahahahahahahahahahah.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.linkedin.com/posts/mariorez_apachecamel-java-activity-6983878843723886592-F7Ue" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FC4D22AQH1zO0JBkT_eQ%2Ffeedshare-shrink_2048_1536%2Ffeedshare-shrink_2048_1536%2F0%2F1665086469589%3Fe%3D2147483647%26v%3Dbeta%26t%3DOr8Lt0n-luHwWdMdXZLLnjccLKaz-Pgx4G5M_ecMb0w" height="166" class="m-0" width="552"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.linkedin.com/posts/mariorez_apachecamel-java-activity-6983878843723886592-F7Ue" rel="noopener noreferrer" class="c-link"&gt;
          Mario Rezende on LinkedIn: #apachecamel #java | 16 comments
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          🐪 #ApacheCamel é o caviar da Dev #JAVA ☕
&amp;amp;quot;Nunca vi, nem comi, só ouço falar&amp;amp;quot; 😁

Mas sério... é uma peça de Software incrível 🏆 | 16 comments on LinkedIn
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca" width="800" height="400"&gt;
        linkedin.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Ainda estou terminando o curso do Vinícius, mas já posso adiantar alguns tópicos que irei abordar. Sendo assim, te aguardo nos próximos posts.&lt;/p&gt;




&lt;p&gt;Esse post faz parte de uma série sobre &lt;strong&gt;Cursos que formaram meu caráter: Desenvolvimento web com Quarkus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A série completa é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Talk is cheap show me the code&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn"&gt;Utilizando Gradle ao invés de Maven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na"&gt;Plugins do Gradle: Gerenciador de versões de bibliotecas com Versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-saudades-do-maven-relatorios-com-project-report-51d6"&gt;Plugins do Gradle: Saudades do  Maven, relatórios com Project-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm"&gt;Plugins do Gradle: API First com o OpenAPI Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-para-apis-reativas-3o9b"&gt;Plugins do Gradle: API First com o OpenAPI Generator para APIs reativas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-validacao-de-vulnerabilidades-com-owasp-dependency-check-2a2l"&gt;Plugins do Gradle: Validação de vulnerabilidades de dependências com OWASP Dependency Check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plugins do Gradle: Lint com Spotless [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Motivação para a escolha [não publicado]&lt;/li&gt;
&lt;li&gt;GitLab: Considerações sobre o Prettier em pipelines [não publicado]&lt;/li&gt;
&lt;li&gt;Gitmoji [não publicado]&lt;/li&gt;
&lt;li&gt;SDK Man [não publicado]&lt;/li&gt;
&lt;li&gt;Pré commit hook [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando YML em propriedades de aplicação [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Utilizando variáveis de ambiente [não publicado]&lt;/li&gt;
&lt;li&gt;application.yml: Sobrescrevendo opções em teste [não publicado]&lt;/li&gt;
&lt;li&gt;Mapstruct: Utilizando expressões para mapeamentos [não publicado]&lt;/li&gt;
&lt;li&gt;Microprofile SecurityScheme: Sobrescrevendo tokenUrl [não publicado]&lt;/li&gt;
&lt;li&gt;Prometheus: O problema simples que me custou algumas horas [não publicado]&lt;/li&gt;
&lt;li&gt;quarkus-hibernate-reactive-panache: Utilizando as vantagens do Hibernate em projetos reativos [não publicado]&lt;/li&gt;
&lt;li&gt;Testcontainers: Configuração para projetos reativos [não publicado]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>quarkus</category>
      <category>udemy</category>
    </item>
    <item>
      <title>SDKMan, adding unlisted versions</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Wed, 20 Oct 2021 00:56:30 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/sdkman-adding-unlisted-versions-5gp7</link>
      <guid>https://dev.to/arthurfnsc/sdkman-adding-unlisted-versions-5gp7</guid>
      <description>&lt;p&gt;&lt;a href="https://sdkman.io"&gt;SDKMan&lt;/a&gt; is a fantastic tool, I believe no one has doubts! Since I installed it, my concerns with &lt;a href="https://gradle.org/"&gt;Gradle&lt;/a&gt;, &lt;a href="https://www.java.com"&gt;Java&lt;/a&gt;, &lt;a href="https://kotlinlang.org/"&gt;Kotlin&lt;/a&gt; versions, among other &lt;strong&gt;SDKs&lt;/strong&gt; ended... As a &lt;strong&gt;JVM&lt;/strong&gt; developer, just not needing to adjust the infamous &lt;strong&gt;JAVA_HOME&lt;/strong&gt;, &lt;strong&gt;M2_HOME&lt;/strong&gt; and others, have already turned my days into happier days.&lt;/p&gt;

&lt;p&gt;Something, however, gave me a certain headache that I would like to share with you:&lt;/p&gt;

&lt;p&gt;I recently started implementing a project with &lt;strong&gt;Java 12&lt;/strong&gt;. At first, I thought, just install this version with  &lt;strong&gt;SDKMan&lt;/strong&gt;, however, I was mistaken... the version didn't appear on any of the vendors when I ran &lt;code&gt;sdk list java&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h3Dbxu8P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9qf6aue571gdigtgwrh6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h3Dbxu8P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9qf6aue571gdigtgwrh6.png" alt="sdk list java"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I still don't understand the reason for this gap, but I started to think about alternatives... I could install the version &lt;strong&gt;16&lt;/strong&gt; and make use of the &lt;strong&gt;Java&lt;/strong&gt; retrocompatibility, however, this started to look as a work around.&lt;/p&gt;

&lt;p&gt;I even thought about installing the pre-&lt;strong&gt;SDKMan&lt;/strong&gt;, however, I was wondering how the &lt;strong&gt;Java&lt;/strong&gt; version management at two distinct points on my operating system, in addition to possible changes to my POM to avoid &lt;a href="https://stackoverflow.com/questions/9170832/list-of-java-class-file-format-major-version-numbers"&gt;compilation version errors&lt;/a&gt;. After some research I found &lt;a href="https://stackoverflow.com/questions/55809928/sdkman-is-missing-a-specific-java-version"&gt;post on StackOverflow&lt;/a&gt;, a solution that I thought was more elegant.:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It seems that downloading the missing version, then unpacking to: &lt;code&gt;~/.sdkman/candidates/java/&lt;/code&gt; then renaming the extracted directory solves the problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With that, I continued using only 1 manager of &lt;strong&gt;Java&lt;/strong&gt; in my operational system, taking advantage of the facilities of &lt;strong&gt;SDKMan&lt;/strong&gt;! &lt;strong&gt;SDKMan&lt;/strong&gt; is life!!!&lt;/p&gt;

</description>
      <category>sdkman</category>
      <category>java</category>
    </item>
    <item>
      <title>SDKMan, adicionando versões não listadas</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Sun, 17 Oct 2021 01:41:14 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/sdkman-adicionando-versoes-nao-listadas-36lj</link>
      <guid>https://dev.to/arthurfnsc/sdkman-adicionando-versoes-nao-listadas-36lj</guid>
      <description>&lt;p&gt;Que o &lt;a href="https://sdkman.io"&gt;SDKMan&lt;/a&gt; é uma ferramenta fantástica creio que ninguém tem dúvidas. Desde que instalei ele minhas preocupações com versões do &lt;a href="https://gradle.org/"&gt;Gradle&lt;/a&gt;, &lt;a href="https://www.java.com"&gt;Java&lt;/a&gt;, &lt;a href="https://kotlinlang.org/"&gt;Kotlin&lt;/a&gt;, dentre outras &lt;strong&gt;SDKs&lt;/strong&gt; terminaram... Como desenvolvedor &lt;strong&gt;JVM&lt;/strong&gt; só de não precisar ajustar os famigerados &lt;strong&gt;JAVA_HOME&lt;/strong&gt;, &lt;strong&gt;M2_HOME&lt;/strong&gt; e outros, já transformaram meus dias em dias mais felizes.&lt;/p&gt;

&lt;p&gt;Algo, no entanto, me deu uma certa dor de cabeça que gostaria de compartilhar com vocês:&lt;/p&gt;

&lt;p&gt;Recentemente comecei a implementar um projeto com &lt;strong&gt;Java 12&lt;/strong&gt;. De início, pensei, basta instalar essa versão com o &lt;strong&gt;SDKMan&lt;/strong&gt;, porém, eu estava enganado... a versão não aparecia em nenhum dos vendors quando eu executava &lt;code&gt;sdk list java&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h3Dbxu8P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9qf6aue571gdigtgwrh6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h3Dbxu8P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9qf6aue571gdigtgwrh6.png" alt="sdk list java"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ainda não entendi o porquê dessa lacuna, mas comecei a pensar em alternativas... eu poderia instalar a versão &lt;strong&gt;16&lt;/strong&gt; e me fazer valer da retrocompatibilidade do &lt;strong&gt;Java&lt;/strong&gt;, porém, isso começou a parecer uma belíssima de uma gambiarra.&lt;/p&gt;

&lt;p&gt;Até pensei em instalar da maneira pré-&lt;strong&gt;SDKMan&lt;/strong&gt;, porém, estava me perguntando como seria a gerência da versão do &lt;strong&gt;Java&lt;/strong&gt; em dois pontos distintos no meu sistema operacional, além de possíveis alterações em meu POM para evitar &lt;a href="https://stackoverflow.com/questions/9170832/list-of-java-class-file-format-major-version-numbers"&gt;erros de versão de compilação&lt;/a&gt;. Foi então que um &lt;a href="https://stackoverflow.com/questions/55809928/sdkman-is-missing-a-specific-java-version"&gt;post no StackOverflow&lt;/a&gt; trouxe uma solução que julguei mais elegante:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It seems that downloading the missing version, then unpacking to: &lt;code&gt;~/.sdkman/candidates/java/&lt;/code&gt; then renaming the extracted directory solves the problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com isso, continuei utilizando apenas 1 gerenciador de versões do &lt;strong&gt;Java&lt;/strong&gt;, aproveitando as facilidades do &lt;strong&gt;SDKMan&lt;/strong&gt;! &lt;strong&gt;SDKMan&lt;/strong&gt; é vida!!!&lt;/p&gt;

</description>
      <category>sdkman</category>
      <category>java</category>
    </item>
    <item>
      <title>Conhecimentos inesperados de um Tech Leader | Pesadelo na Cozinha: Introdução</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Mon, 26 Apr 2021 16:06:40 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/conhecimentos-inesperados-de-um-tech-leader-pesadelo-na-cozinha-introducao-5b5j</link>
      <guid>https://dev.to/arthurfnsc/conhecimentos-inesperados-de-um-tech-leader-pesadelo-na-cozinha-introducao-5b5j</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Recentemente em minhas buscas por programações para entretenimento me deparei com o programa &lt;a href="https://www.band.uol.com.br/entretenimento/pesadelo-na-cozinha"&gt;Pesadelo na Cozinha&lt;/a&gt; apresentado por &lt;strong&gt;Erick Jacquin&lt;/strong&gt;. Os episódios que usaremos no decorrer dos posts estão disponíveis no &lt;a href="https://www.youtube.com/channel/UCp7tUxXfE9jUtkMLGCzeXqA"&gt;canal deles no YouTube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Basicamente o programa nos mostra &lt;strong&gt;Jacquin&lt;/strong&gt; interagindo com vários restaurantes e mostrando pontos de desorganização e desperdícios.&lt;/p&gt;

&lt;p&gt;O foco da série que vou escrever não vai girar em torno da veracidade de tudo, porque eu às vezes fico com pé atrás em programas que as pessoas sabem estar sendo gravadas e agem de determinada maneira ¯|&lt;em&gt;(ツ)&lt;/em&gt;/¯. Então, sim, tenho minhas dúvidas sobre a espontaneidade dos participantes, inclusive do &lt;strong&gt;Jacquin&lt;/strong&gt;, mas isso não será problema para as análises que vamos fazer aqui.&lt;/p&gt;




&lt;h1&gt;
  
  
  Afinal, o que isso tem a ver com Tech Leader?
&lt;/h1&gt;

&lt;p&gt;Uma das coisas que tento fazer é não desassociar meu “eu-profissional” do meu “eu-pessoal”. Quando vejo filmes, séries, leio livros, ouço músicas geralmente tento fazer paralelos dessas coisas com a minha vida de modo geral. Isso pode ser visto em alguns posts que escrevi como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://arthurfnsc.medium.com/n%C3%A3o-seja-esse-tipo-de-desenvolvedor-c3528f265e2f"&gt;Não seja esse tipo de desenvolvedor&lt;/a&gt;: post inspirado no excelente mangá &lt;a href="https://editorajbc.com.br/mangas/colecao/terra-formars/"&gt;Terraformars&lt;/a&gt; e no seu paralelo com o mundo do desenvolvimento. Wolf Redfield é um desenvolvedor de software no mangá e essa parte da história mostra algo que muitos desenvolvedores passam diariamente, e algo, que como mostrado, tem um efeito devastador: necessidade de entregas cada vez mais rápidas e entregas cada vez maiores.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arthurfnsc.medium.com/dpf-e-testes-de-software-d3101833ae35"&gt;Departamento de Polícia da Física e Testes de software&lt;/a&gt;: post inspirado na HQ &lt;a href="https://loja.panini.com.br/panini/solucoes/busca.aspx?t=dpf"&gt;DPF&lt;/a&gt; onde as constantes físicas já não são mais constantes, e um paralelo como às vezes nossos “testes unitários” parecem testar coisas que “não confiamos”, como adicionar elemento a uma lista e testar em seguida que a lista não está vazia ¯|&lt;em&gt;(ツ)&lt;/em&gt;/¯ ou testar se o save e findById do Spring Data… salvam… e… recuperam por id (para quem não trabalha com Spring, esses métodos já são dados pela interface que implementamos… testar o default nesse caso seria testar o framework, como se o próprio projeto spring-data não o fizesse). O objetivo do post é discutir o que são regras que são constantes e o que são regras passíveis de testar, um teste em que criamos um objeto com new e em seguida fazemos uma asserção para validar se ele não é nulo só quer dizer que não confiamos nas regras constantes da nossa linguagem.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arthurfnsc.medium.com/review-o-ponto-da-virada-malcolm-gladwell-80a2be208c96"&gt;Review O Ponto da Virada - Malcolm Gladwell&lt;/a&gt;: post em que faço um paralelo com um artigo chamado &lt;a href="http://members.pingnet.ch/gamma/junit.htm"&gt;Test Infected&lt;/a&gt; de Kent Beck e Erich Gamma.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/arthurfnsc/paul-arden-quao-grande-voce-quer-ser-parte-1-sobre-a-excelencia-e-feedbacks-357"&gt;Série de livros de Paul Arden&lt;/a&gt;: nesses posts escrevo sobre 2 livros de Paul Arden e questões como feedback, discordância de pontos de vista, DevOps, até sobre como apliquei ArchUnit em um projeto o.O…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Realmente é bem interessante ler sobre o que você escreveu há um tempo…&lt;/p&gt;

&lt;p&gt;Com o &lt;strong&gt;Pesadelo na Cozinha&lt;/strong&gt; não foi diferente, ao acompanhar os episódios foi possível enxergar uma certa padronização de ações que davam para serem isoladas no “modus operandi” do programa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teste de resiliência/ exploratório individual, quando &lt;strong&gt;Jacquin&lt;/strong&gt; pede vários pratos de uma vez só, validando a atenção no processamento das informações e em como tarefas “simultâneas” são executadas.&lt;/li&gt;
&lt;li&gt;Teste de resiliência múltiplo, quando o restaurante é submetido a um pico de requisições em um dia cheio.&lt;/li&gt;
&lt;li&gt;Validação de sobreposição de funções ou ausência de funções no time. Definição de Chefes.&lt;/li&gt;
&lt;li&gt;Anti-Pattern “Ah, eu sempre digo isso mas ninguém me escuta”.&lt;/li&gt;
&lt;li&gt;Anti-Pattern “Ah, só somos assim porque não temos x”.&lt;/li&gt;
&lt;li&gt;Execução de um novo prato ensinado.&lt;/li&gt;
&lt;li&gt;Falha e sucesso na execução de um novo prato ensinado.&lt;/li&gt;
&lt;li&gt;Adesão de maquinário e novos pratos.&lt;/li&gt;
&lt;li&gt;Falha e sucesso mesmo com novo maquinário e novos pratos ensinado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_EuB_ZWx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sxil0h1pmp4eps2ylssh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_EuB_ZWx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sxil0h1pmp4eps2ylssh.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada um desses pontos pode ser analisado sob uma ótica de liderança, falarei sobre a liderança técnica, mas poderia ser outra ou outra analogia.&lt;/p&gt;

&lt;p&gt;Por exemplo, quando vejo pessoas que dizem que “só” não evoluíram por falta da ferramenta x, y ou z tem um ponto que geralmente esquecemos, que mesmo se tivéssemos a melhor ferramenta e melhores definições, ainda sim, precisamos estar prontos para executar isso. Isso fica bem evidente quando a equipe recebe todo um novo maquinário e isso não resolve os problemas deles, porque a questão não é a ferramenta pela ferramenta apenas, mas como extrair o melhor dela com nossas habilidades.&lt;/p&gt;

&lt;p&gt;Outro exemplo é o anseio de pessoas em serem Chefes sem terem passado por desafios que as direciona a tal, algo semelhante ao que vemos de pessoas que estão no começo de suas carreiras e já querem ser sênior com pouco tempo, sem perceberem os desafios e exigências dessas funções.&lt;/p&gt;




&lt;p&gt;Enfim… começarei a escrever cada um desses pontos em artigos separados, só ainda não fechei o número de posts, mas ao menos cada ponto mencionado acima dá um…&lt;/p&gt;

&lt;p&gt;E você? Consegue enxergar mais alguma analogia? Se sim, me fala… Também irei escrever em outros idiomas como inglês e espanhol para treinar um pouco, sendo assim, qualquer sugestão de melhoria é bem-vinda. Uso muito o &lt;a href="https://www.grammarly.com/"&gt;Grammarly&lt;/a&gt; e o &lt;a href="https://languagetool.org/"&gt;Language Tool&lt;/a&gt; para isso, um mais focado em inglês e outro com suporte a mais idiomas.&lt;/p&gt;




&lt;p&gt;Original post published at &lt;a href="https://arthurfnsc.medium.com/conhecimentos-inesperados-de-um-tech-leader-pesadelo-na-cozinha-introdu%C3%A7%C3%A3o-bdd85fc070c4"&gt;https://medium.com&lt;/a&gt; on April 25th, 2021.&lt;/p&gt;

</description>
      <category>techleader</category>
      <category>software</category>
      <category>pesadelonacozinha</category>
    </item>
    <item>
      <title> Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 2: Sobre Documentação)</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Thu, 17 Sep 2020 00:46:25 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/corda-blockchain-desafio-r3-pensamentos-sobre-minha-metodologia-de-aprender-algo-novo-parte-2-sobre-documentacao-3cj8</link>
      <guid>https://dev.to/arthurfnsc/corda-blockchain-desafio-r3-pensamentos-sobre-minha-metodologia-de-aprender-algo-novo-parte-2-sobre-documentacao-3cj8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“Tem horas em que entender errado é pior do que não entender” &lt;strong&gt;Thiago Grulha&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse terceiro posts sobre &lt;a href="https://www.corda.net/" rel="noopener noreferrer"&gt;Corda Blockchain&lt;/a&gt; falaremos sobre o documentação e &lt;strong&gt;README&lt;/strong&gt;, uma etapa geralmente negligenciada por nós desenvolvedores.&lt;/p&gt;




&lt;h1&gt;
  
  
  Para que documentar algo que eu já sei?
&lt;/h1&gt;

&lt;p&gt;Sempre que falo sobre documentação de um conhecimento me lembro do seguinte post que escrevi uma vez em que menciono uma história que o já famoso &lt;a href="https://dev.to/felipebelluco"&gt;Felipe Belluco&lt;/a&gt; uma vez me disse:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Acho interessante que sempre que aprendermos um comando ou algo novo a gente crie uma documentação bem simples.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso me trouxe à mente um problema que eu já havia passado com um &lt;a href="https://gradle.org/" rel="noopener noreferrer"&gt;Gradle&lt;/a&gt; há um tempo atrás.&lt;/p&gt;

&lt;p&gt;Como todo “bom programador”, criei um projeto para testar umas coisas, porém esqueci de versionar…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F81a478nhteoqs9nwa2ir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F81a478nhteoqs9nwa2ir.png" alt="Fuê"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dias depois, passei pelo mesmo problema que tinha resolvido nesse projeto, fui procurar para ver a solução, e tinha deletado o projeto…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fld35th15ru6clh66f53k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fld35th15ru6clh66f53k.png" alt="Fuê-Fuê"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Projeto Konami Code
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqq2tg8nuks9vzl2v93hx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqq2tg8nuks9vzl2v93hx.jpg" alt="Konami Code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acho que todo mundo que já trabalhou com desenvolvimento já se deparou uma vez na vida com a situação de interagir com algo que não se faz a ideia de como simular o ambiente localmente ou como testar uma mudança antes de mandar quilo para produção.&lt;/p&gt;

&lt;p&gt;Em um dos clientes que trabalhei, uma frase ficou bem marcada em minha mente:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Você sabe como é, aqui na empresa temos vários projetos, mas cada um tem sua ‘manha’ para executar. Ai ficamos perdendo tempo tentando nos lembrar como fazer isso funcionar projeto a projeto”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Chamo esses projetos de &lt;strong&gt;Projetos Konami Code&lt;/strong&gt;, precisamos de todo uma abstração, sorte, e execuções dos mais diversos comandos para fazer a solução “subir”.&lt;/p&gt;




&lt;h1&gt;
  
  
  O time cresceu, problema à vista
&lt;/h1&gt;

&lt;p&gt;Outra problemática dessa abordagem é o crescimento do time… Não vamos conseguir passar tão simples os &lt;strong&gt;Konami Codes&lt;/strong&gt; de todos os projetos que ele vai trabalhar, e ai, a gente vira a “própria documentação do código”:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Como subo o projeto no &lt;strong&gt;IntelliJ&lt;/strong&gt;? Como baixo essa dependência X que não encontro no &lt;strong&gt;Maven Repository&lt;/strong&gt;? Meu projeto não compila, o que eu faço?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dentre outras perguntas…&lt;/p&gt;

&lt;p&gt;A resposta para esses e outros problemas está na documentação do seu projeto.&lt;/p&gt;




&lt;h1&gt;
  
  
  Mas documentar o que? Tudo?
&lt;/h1&gt;

&lt;p&gt;Na &lt;a href="https://www.aisdigital.com.br/" rel="noopener noreferrer"&gt;AIS Digital&lt;/a&gt; trabalhamos com ferramentas para documentação de projeto, porém, é bem interessante saber separar o que deveria ser documentado na página do projeto como um todo, e o que deveria ser documentado em cada repositório.&lt;/p&gt;

&lt;p&gt;Aqui não vou trazer nenhuma receita de bolo, o ponto que eu sempre sigo é: documentar o máximo que você achar que é necessário, seja na página do projeto, seja no repositório.&lt;/p&gt;

&lt;p&gt;Por exemplo: Um repositório que peguei na &lt;a href="https://www.aisdigital.com.br/" rel="noopener noreferrer"&gt;AIS Digital&lt;/a&gt; tinha documentado que para usar o container de um banco em específico era necessário aceitar os termos do mesmo, para podermos baixar a imagem; em outro documentei que em uma abordagem com &lt;strong&gt;API First&lt;/strong&gt; era comum que após a geração de classes o projeto continuasse a apresentar erros porque a &lt;strong&gt;IDE&lt;/strong&gt; ainda não tinha realizado a indexação das novas classes geradas, sendo necessário um &lt;strong&gt;refresh&lt;/strong&gt; para isso.&lt;/p&gt;

&lt;p&gt;O ponto aqui é: documente o máximo que tu acha que pode te ajudar a outra pessoa não precisar te mandar email, ligar, mandar &lt;strong&gt;Slack&lt;/strong&gt; para saber como interagir com o projeto!&lt;/p&gt;

&lt;p&gt;No caso de projetos no &lt;strong&gt;Github&lt;/strong&gt;, geralmente tento documentar o máximo de coisas, pois não vou ter ferramentas como &lt;a href="https://www.atlassian.com/br/software/confluence" rel="noopener noreferrer"&gt;Confluence&lt;/a&gt;, &lt;a href="https://www.microsoft.com/pt-br/microsoft-365/sharepoint/collaboration" rel="noopener noreferrer"&gt;Sharepoint&lt;/a&gt; e outras para essa documentação.&lt;/p&gt;

&lt;p&gt;Vamos então falar sobre a documentação do nosso repositório no &lt;a href="https://github.com/arthurfnsc/ms-cambio" rel="noopener noreferrer"&gt;Github&lt;/a&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conheça os recursos de Markdown de sua solução de versionamento
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/dianaops"&gt;Diana Regina&lt;/a&gt; em um &lt;a href="https://dev.to/dianaops/como-escrever-um-readme-md-sensacional-no-github-4509"&gt;post&lt;/a&gt; descreveu com maestria alguns pontos que podem nos ajudar a melhorar a documentação de nosso repositório.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/filipe-dias-633403151/?lipi=urn%3Ali%3Apage%3Ad_flagship3_pulse_read%3BSBHE6JdmRdmTffrG1YifmA%3D%3D" rel="noopener noreferrer"&gt;Filipe Dias&lt;/a&gt;, uma vez me mostrou esse &lt;a href="https://github.com/matiassingers/awesome-readme" rel="noopener noreferrer"&gt;repositório&lt;/a&gt; também, que pode nos ajudar a escrever &lt;strong&gt;Awesome READMEs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Um ponto que os dois tem em comum é chamar a atenção para o suporte a &lt;strong&gt;Markdowns&lt;/strong&gt; da solução de versionamento que se deseja usar…&lt;/p&gt;

&lt;p&gt;Por exemplo, no caso do &lt;a href="https://github.com/arthurfnsc/ms-cambio" rel="noopener noreferrer"&gt;nosso projeto&lt;/a&gt;, vocês podem ver que a parte de &lt;strong&gt;Instruções&lt;/strong&gt; nos itens &lt;strong&gt;Java 8&lt;/strong&gt; e &lt;strong&gt;Gradle (Opcional)&lt;/strong&gt; são itens clicáveis que expandem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj9w74v3usrehsv9ddhh4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj9w74v3usrehsv9ddhh4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso é possível graças a uma &lt;strong&gt;tag HTML&lt;/strong&gt; dentro do &lt;strong&gt;README.md&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;details&amp;gt;&amp;lt;summary&amp;gt;&amp;lt;b&amp;gt;Instruções&amp;lt;/b&amp;gt;&amp;lt;/summary&amp;gt;

[Dados a serem ocultados]

&amp;lt;/details&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E para os mais críticos que acreditam que &lt;strong&gt;Markdown&lt;/strong&gt; não deve se misturar com &lt;strong&gt;HTML&lt;/strong&gt;, no post &lt;strong&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 3: Sobre Lint)&lt;/strong&gt; além de falarmos sobre &lt;strong&gt;Lint&lt;/strong&gt; para &lt;strong&gt;Kotlin&lt;/strong&gt;, falaremos sobre um &lt;strong&gt;Lint&lt;/strong&gt; para &lt;strong&gt;Markdown&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Voltando a falar sobre &lt;strong&gt;tags HTML&lt;/strong&gt; em &lt;strong&gt;Markdown&lt;/strong&gt;, adivinhem então o que aconteceu quando tentei colocar essas mesmas &lt;strong&gt;tags&lt;/strong&gt; em um projeto que eu estava participando que não estava no &lt;strong&gt;GitHub&lt;/strong&gt; (não me lembro agora se foi no &lt;strong&gt;Bitbucket&lt;/strong&gt; ou &lt;strong&gt;GitLab&lt;/strong&gt;)?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa0sa8t4vdortjcxirr4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa0sa8t4vdortjcxirr4s.png" alt="Fuê-Fuê-Fuê"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Descobri que existia diferença entre interpretadores de &lt;strong&gt;Markdown&lt;/strong&gt; de acordo com a solução de versionamento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://confluence.atlassian.com/bitbucketserver/markdown-syntax-guide-776639995.html" rel="noopener noreferrer"&gt;Bitbucket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://guides.github.com/features/mastering-markdown/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.gitlab.com/ce/user/markdown.html" rel="noopener noreferrer"&gt;GitLab Community Edition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em alguns deles você possui, inclusive, &lt;strong&gt;tags&lt;/strong&gt; especiais, como &lt;strong&gt;[TOC]&lt;/strong&gt; (&lt;strong&gt;Table of Contents&lt;/strong&gt;). Essa &lt;strong&gt;tag&lt;/strong&gt; cria um índice do seu projeto, e para tanto, cada cabeçalho irá se tornar um item com uma âncora de acesso “linkada”.&lt;/p&gt;

&lt;p&gt;Sendo assim, uma dica é conheça o que você tem em mãos para facilitar sua documentação.&lt;/p&gt;




&lt;h1&gt;
  
  
  Executando o projeto
&lt;/h1&gt;

&lt;p&gt;Quando pensei em documentar o nosso projeto, pensei em algumas informações e comandos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Obrigatoriedade do &lt;strong&gt;Java 8&lt;/strong&gt;, incluindo um &lt;a href="https://github.com/arthurfnsc/ms-cambio/tree/feature/flow-tests#erros-ao-rodar-os-testes" rel="noopener noreferrer"&gt;ponto importante para testes&lt;/a&gt; (que ainda não fiz o &lt;strong&gt;merge&lt;/strong&gt; por conta da competição que estou participando, e por esse &lt;strong&gt;commit&lt;/strong&gt; ter acontecido depois da data de entrega; esse &lt;strong&gt;merge&lt;/strong&gt; pode ter sido realizado dependendo de quando você esteja vendo esse artigo, procure pela seção &lt;strong&gt;Erros ao rodar os testes&lt;/strong&gt;);&lt;/li&gt;
&lt;li&gt;Não obrigatoriedade de &lt;strong&gt;Gradle&lt;/strong&gt; instalado na máquina para execução do projeto;&lt;/li&gt;
&lt;li&gt;Como clonar o projeto;&lt;/li&gt;
&lt;li&gt;Como gerar os nodes;&lt;/li&gt;
&lt;li&gt;Como rodar os nodes;&lt;/li&gt;
&lt;li&gt;Como executar a “aplicação do banco” e a “aplicação da corretora”&lt;/li&gt;
&lt;li&gt;Dentre outras tasks importantes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma vez que o projeto é público, a ideia é tornar mais simples para outras pessoas interagirem com ele e poderem dar feedbacks de melhorias.&lt;/p&gt;




&lt;h1&gt;
  
  
  Plugins Gradle de documentação
&lt;/h1&gt;

&lt;p&gt;Sobre a parte de documentação, também podemos usar plugins do Gradle. No nosso projeto, os utilizados para documentar estão descritos no arquivo &lt;strong&gt;plugins/docs.gradle&lt;/strong&gt;. Mais sobre como utilizar plugins você pode ver em: &lt;strong&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 1: Sobre Gradle)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://github.com/Kotlin/dokka" rel="noopener noreferrer"&gt;Dokka&lt;/a&gt; gera a documentação de cada projeto contido no nosso repositório. Nesse caso, dentro do &lt;strong&gt;build&lt;/strong&gt; de &lt;strong&gt;application/cordapp-contracts-states&lt;/strong&gt;, &lt;strong&gt;application/cordapp-flows&lt;/strong&gt; e &lt;strong&gt;application/rest-api&lt;/strong&gt; é possível ver uma pasta &lt;strong&gt;dokka&lt;/strong&gt; com um &lt;strong&gt;HTML&lt;/strong&gt; de nossas classes. Ainda preciso configuração a agregação de todos os relatórios para o &lt;strong&gt;build&lt;/strong&gt; da raiz.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://docs.gradle.org/current/userguide/project_report_plugin.html" rel="noopener noreferrer"&gt;Project-Report&lt;/a&gt; está mais focado em relatórios de &lt;strong&gt;dependências de projeto&lt;/strong&gt; e &lt;strong&gt;tasks de projeto&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://github.com/ben-manes/gradle-versions-plugin" rel="noopener noreferrer"&gt;Gradle-Versions&lt;/a&gt; é um cara tão fera que resolvi dar para ele um post exclusivo, falaremos sobre ele em &lt;strong&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 4: Sobre Versões Desatualizadas de dependências)&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Gitm😜ji e Gitm😜ji-Changelog
&lt;/h1&gt;

&lt;p&gt;Utilizei &lt;a href="https://gitmoji.carloscuesta.me/" rel="noopener noreferrer"&gt;Gitm😜ji&lt;/a&gt; para meus &lt;strong&gt;commits&lt;/strong&gt; serem mais assertivos. A ideia é que uma pessoa pelo emoji tenha ideia do que o &lt;strong&gt;commit&lt;/strong&gt; se propõe a fazer, para não precisar clicar em &lt;strong&gt;commit&lt;/strong&gt; por &lt;strong&gt;commit&lt;/strong&gt; para analisar.&lt;/p&gt;

&lt;p&gt;A proposta é ter um &lt;strong&gt;commit&lt;/strong&gt; por ação, para não ficar naqueles &lt;strong&gt;commits&lt;/strong&gt; que alteram tudo no projeto e tu já nem controla mais isso depois. O uso de &lt;strong&gt;squash&lt;/strong&gt; e &lt;strong&gt;rebase&lt;/strong&gt; funcionam de forma linda com esse cara!&lt;/p&gt;

&lt;p&gt;Um outro cara bem fera que pretendo usar é &lt;a href="https://github.com/frinyvonnick/gitmoji-changelog" rel="noopener noreferrer"&gt;Gitm😜ji-Changelog&lt;/a&gt;, ele agrega seus &lt;strong&gt;commits&lt;/strong&gt; por &lt;strong&gt;tags&lt;/strong&gt; e facilita a geração de &lt;strong&gt;changelog&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;No demais é isso… nos encontraremos no próximo post em que falarei sobre como iniciei minha jornada com &lt;strong&gt;Kotlin&lt;/strong&gt; e como um bom &lt;strong&gt;Lint&lt;/strong&gt; é (quase) tudo o que precisamos para aprender uma linguagem nova.&lt;/p&gt;

&lt;p&gt;E você tem alguma consideração sobre &lt;strong&gt;README&lt;/strong&gt; ou documentação de repositórios, e quer trocar uma ideia? Só bora…&lt;/p&gt;

&lt;p&gt;Esse post faz parte de uma série sobre &lt;strong&gt;Corda Blockchain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A série completa é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/corda-blockchain-desafio-r3-pensamentos-sobre-minha-metodologia-de-aprender-algo-novo-introducao-4jnb"&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Introdução)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/corda-blockchain-desafio-r3-pensamentos-sobre-minha-metodologia-de-aprender-algo-novo-parte-1-sobre-gradle-48c3"&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 1: Sobre Gradle)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 2: Sobre Documentação)&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 3: Sobre Lint) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 4: Sobre Versões Desatualizadas de dependências) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 5: Sobre Vulnerabilidades de dependências) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 6: Sobre Github flow) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 7: Sobre desenvolvimento em Corda) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 8: Sobre testes em Corda) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 9: Sobre AssertJ) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 10: Sobre testes de arquitetura) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 11: Sobre testes de mutantes) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 12: Sobre JaCoCo) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 13: Sobre SonarQube) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 14: Sobre API First e OpenAPI 3) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 15: Sobre Springboot) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 16: Sobre Mapstruct) [não publicado]&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Esse artigo foi escrito ouvindo-se &lt;strong&gt;Afterimage | Unveil the Unseen&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/album/4sJVyiNvyXB00TfUsKeqHY" width="100%" height="380px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Original post published at &lt;a href="https://medium.com/@arthurfnsc/corda-blockchain-desafio-r3-pensamentos-sobre-minha-metodologia-de-aprender-algo-novo-parte-2-ef1cf2adef7c" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; on September 16th, 2020.&lt;/p&gt;

</description>
      <category>corda</category>
      <category>blockchain</category>
      <category>markdown</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 1: Sobre Gradle)</title>
      <dc:creator>Arthur Fonseca</dc:creator>
      <pubDate>Tue, 15 Sep 2020 21:28:37 +0000</pubDate>
      <link>https://dev.to/arthurfnsc/corda-blockchain-desafio-r3-pensamentos-sobre-minha-metodologia-de-aprender-algo-novo-parte-1-sobre-gradle-48c3</link>
      <guid>https://dev.to/arthurfnsc/corda-blockchain-desafio-r3-pensamentos-sobre-minha-metodologia-de-aprender-algo-novo-parte-1-sobre-gradle-48c3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“Eu sou parte de uma equipe.&lt;/p&gt;

&lt;p&gt;Então, quando venço, não sou eu apenas quem vence. De certa forma, termino o trabalho de um grupo enorme de pessoas” &lt;strong&gt;Ayrton Senna&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse segundo posts sobre &lt;a href="https://www.corda.net/"&gt;Corda Blockchain&lt;/a&gt; falaremos sobre o &lt;a href="https://gradle.org/"&gt;Gradle&lt;/a&gt;, uma ferramenta de automação que ajuda no gerenciamento de ciclo de vida de projetos.&lt;/p&gt;




&lt;h1&gt;
  
  
  Sobre como aprendo
&lt;/h1&gt;

&lt;p&gt;Desculpem o vacilo e lapso mental… essa é a última parte do post que estou escrevendo, e é a mais importante, a que deu origem ao título sobre &lt;strong&gt;minha metodologia de aprendizado&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Basicamente o que faço é me abastecer de todo o conhecimento que tenho até o dado momento, por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O desafio não é com &lt;strong&gt;Corda&lt;/strong&gt; e &lt;strong&gt;JVM&lt;/strong&gt;? Com toda a certeza vou escolher &lt;strong&gt;Kotlin&lt;/strong&gt; dado a limitação do &lt;strong&gt;Java 8&lt;/strong&gt; com &lt;strong&gt;Corda&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tem &lt;strong&gt;Gradle&lt;/strong&gt; no meio? Com certeza vou aplicar a última versão do &lt;strong&gt;Gradle&lt;/strong&gt; e fazer meus testes.&lt;/li&gt;
&lt;li&gt;As versões de dependências serão sempre as últimas a não ser que eu apanhe de alguma delas, assim aproveito e testo novas coisas…&lt;/li&gt;
&lt;li&gt;Posso não saber de &lt;strong&gt;Corda&lt;/strong&gt;, mas &lt;strong&gt;Springboot&lt;/strong&gt;, &lt;strong&gt;Kotlin&lt;/strong&gt; e &lt;strong&gt;Gradle&lt;/strong&gt; são obrigação…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses foram alguns pensamentos que pairaram minha cabeça quando iniciei o desenvolvimento… eu tinha uma zona de segurança a qual me alicerçar, a questão era então saber como aplicar &lt;strong&gt;Corda&lt;/strong&gt; a todo o arcabouço de conhecimento que eu já tinha.&lt;/p&gt;

&lt;p&gt;O que eu faço? Basicamente pego duas ideias e tento juntá-las… mais para frente falaremos que a ideia desse código entregue foi a junção do meu conhecimento de &lt;a href="https://github.com/arthurfnsc/openapi-apifirst"&gt;API First&lt;/a&gt; com esse &lt;a href="https://github.com/corda/samples-kotlin/tree/master/Advanced/negotiation-cordapp"&gt;repositório de negociações em Corda&lt;/a&gt;. Copio e colo de início mesmo… tento entender o porque as coisas funcionam… começo a tirar partes do código e ver se ainda sim funcionam ou o comportamento inesperado que geram… essa é basicamente a forma como aprendo algo novo.&lt;/p&gt;

&lt;p&gt;Agora que eu já justifiquei o título da série inteira, vamos voltar à programação original…&lt;/p&gt;




&lt;h1&gt;
  
  
  Gradle 101 — History so far…
&lt;/h1&gt;

&lt;p&gt;11 de Novembro de 2016, um commit simples, mas um marco fundamental na minha carreira:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Atualização de arquitetura de projeto para Gradle”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esse pequeno texto refletiria muito para mim, e olha eu escrevendo sobre ele mais de 3 anos depois… Foi um commit que removi o &lt;strong&gt;Maven&lt;/strong&gt; de um projeto e apliquei o &lt;strong&gt;Gradle&lt;/strong&gt;, deixando o projeto ainda funcionando.&lt;/p&gt;

&lt;p&gt;Como a maioria dos desenvolvedores &lt;strong&gt;Java&lt;/strong&gt; que conheço, iniciei minha vida utilizando o &lt;a href="https://maven.apache.org/"&gt;Maven&lt;/a&gt;. Eu ficava maravilhado com todo aquele &lt;strong&gt;XML&lt;/strong&gt; que eu poderia utilizar para gerenciar meu projeto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V1VPAGSD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7q4qb7nwicymex0yb764.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V1VPAGSD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7q4qb7nwicymex0yb764.jpg" alt="Sarcasm"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na real, para a galera não vir aqui falando que eu sou “modinha”, meu ponto é basicamente o seguinte: é mais que obrigação de alguém que chega depois e, estuda os problemas que um dado player resolve, analisar os gaps e se propor a fazer melhor…&lt;/p&gt;

&lt;p&gt;Quem fala que &lt;strong&gt;Maven&lt;/strong&gt; isso ou aquilo às vezes pensa que essa história começou simplesmente do &lt;strong&gt;Maven&lt;/strong&gt; e depois apareceu magicamente o &lt;strong&gt;Gradle&lt;/strong&gt;, mas nossa timeline poderia ser melhor descrita assim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2000 — &lt;a href="https://ant.apache.org/"&gt;Another Neat Tool&lt;/a&gt; (sim… a formiguinha (&lt;strong&gt;ANT&lt;/strong&gt;) é só um acrônimo… obrigado, de nada)&lt;/li&gt;
&lt;li&gt;2002 — &lt;a href="https://maven.apache.org/"&gt;Maven&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;2005 — &lt;a href="https://ant.apache.org/ivy/"&gt;Ivy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;2007 — &lt;a href="https://gant.github.io/"&gt;Gant&lt;/a&gt; (Sim… tentaram reviver o &lt;strong&gt;ANT&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;2007 — &lt;a href="https://gradle.com/"&gt;Gradle&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É muito fácil olhar para o &lt;strong&gt;Maven&lt;/strong&gt; hoje e pensar que existem outras formas de fazer as coisas… é tipo aquela galera que olha para &lt;strong&gt;SOAP&lt;/strong&gt; e se sente o iluminado por usar &lt;strong&gt;REST&lt;/strong&gt;, como se na época em que o protocolo foi criado essa não tivesse sido uma boa aposta e que até hoje funciona.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Ain, ele usa SOAP, que ultrapassado…”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A8234Miq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qmfcr5jt10uhoaeod7z4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A8234Miq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qmfcr5jt10uhoaeod7z4.jpg" alt="Mi-mi-mi"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O problema que sempre tivemos era como versionar dependências que usamos no projeto para não ficarmos com projetos grandes demais, evitar versionar libs. Além disso, como criar nossos scripts para facilitar isso…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XML&lt;/strong&gt; tinha a vantagem de manter uma estrutura baseada em um &lt;strong&gt;XML Schema Definition&lt;/strong&gt; (&lt;strong&gt;XSD&lt;/strong&gt;) para a gente…&lt;/p&gt;

&lt;p&gt;Um dos problemas é que dependendo do projeto, seu &lt;strong&gt;pom.xml&lt;/strong&gt; ficava gigante…&lt;/p&gt;

&lt;p&gt;Não consegui achar de onde peguei a imagem, mas creio que foi do próprio &lt;strong&gt;Gradle&lt;/strong&gt; em uns &lt;a href="https://gradle.com/training/"&gt;treinamentos gratuitos&lt;/a&gt; deles que eu fiz, que &lt;strong&gt;são muito bons, diga-se de passagem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aVRVJVo8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kjvh6eb71rmlrtw4ul1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aVRVJVo8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kjvh6eb71rmlrtw4ul1g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse ponto, cheguei à conclusão que a discussão entre &lt;strong&gt;Maven&lt;/strong&gt; e &lt;strong&gt;Gradle&lt;/strong&gt; é gosto… ainda que o &lt;strong&gt;Gradle&lt;/strong&gt; tenha uma página dedicada apenas a essa comparação, outros fatores também são importantes para a decisão: profissionais que trabalham com cada uma das frentes, como definir uma arquitetura corporativa, quantidade de plugins, dentre outras…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gradle.org/maven-vs-gradle/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KlFQEemV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://boaglio.com/wp-content/uploads/2019/09/m2-gradle.png" alt="Gradle vs Maven Comparison | https://boaglio.com/index.php/2019/09/05/10-motivos-para-usar-maven-ou-gradle-em-seu-projeto/"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já conversei com arquitetos que não viam vantagem de poder programar em ferramentas de build, com o &lt;strong&gt;Gradle&lt;/strong&gt;, por exemplo, é possível ter essa parte em &lt;strong&gt;Groovy&lt;/strong&gt; ou &lt;strong&gt;Kotlin&lt;/strong&gt; hoje.&lt;/p&gt;

&lt;p&gt;Enfim… creio que fica muito mais como uma escolha de cada um… nesse post a ideia é mostrar as vantagens de se aplicar &lt;strong&gt;Gradle&lt;/strong&gt; no nosso projeto, e como pensei para fazê-lo.&lt;/p&gt;




&lt;h1&gt;
  
  
  Mas Gradle não era só para Android?
&lt;/h1&gt;

&lt;p&gt;Minha história com o &lt;strong&gt;Gradle,&lt;/strong&gt; apesar daquele commit em código que foi para produção, começou antes, por volta de 2012/ 2013.&lt;/p&gt;

&lt;p&gt;À época eu trabalhava em um instituto de pesquisa de Brasília, o &lt;a href="https://ibti.org.br/"&gt;IBTI&lt;/a&gt;. Lá, um desenvolvedor Android chamado &lt;a href="https://dev.to/felipebelluco"&gt;Felipe Belluco&lt;/a&gt; uma vez veio me perguntar se eu estava a fim de conhecer “umas coisas diferenciadas”.&lt;/p&gt;

&lt;p&gt;Uma das vantagens de um instituto de pesquisas é pesquisar, algo semelhante ao que escrevi em um post sobre &lt;a href="https://dev.to/arthurfnsc/paul-arden-pensando-ao-contrario-parte-2-experimentando-coisas-novas-mesmo-nao-gostando-inicialmente-35kc"&gt;Paul Arden e experimentar coisas novas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Acabei gostando muito… falarei novamente do Sr. Belluco adiante quando formos falar sobre &lt;strong&gt;Lint&lt;/strong&gt; para &lt;strong&gt;Kotlin&lt;/strong&gt;, afinal, esse Sr. me apresentou &lt;strong&gt;Gradle&lt;/strong&gt; e &lt;strong&gt;Kotlin&lt;/strong&gt;… Um homem, uma lenda, um mito…&lt;/p&gt;

&lt;p&gt;Respondendo a pergunta do tópico, não, &lt;strong&gt;Gradle&lt;/strong&gt; pode ser utilizado em mais cenários além de &lt;strong&gt;Android&lt;/strong&gt;. E mesmo para quem acha que ele está restrito à &lt;strong&gt;JVM&lt;/strong&gt;, segue a seguinte informação do &lt;a href="https://gradle.org/"&gt;próprio site deles&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write in Java, C++, Python or your language of choice. Package for deployment on any platform. Go monorepo or multi-repo. And rely on Gradle’s unparalleled versatility to build it all.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Sobre o projeto
&lt;/h1&gt;

&lt;p&gt;Como dito anteriormente, o projeto que iremos discorrer nesses posts está versionado no &lt;a href="https://github.com/arthurfnsc/ms-cambio"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Vamos falar sobre alguns pontos interessante:&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapper
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;gradlew&lt;/strong&gt; e &lt;strong&gt;gradlew.bat&lt;/strong&gt;, esses são dois caras que muitas pessoas tem em seus projetos e não sabem para que servem. Como descrito no &lt;strong&gt;README&lt;/strong&gt; do nosso projeto:&lt;/p&gt;

&lt;p&gt;O projeto foi concebido para que a instalação do Gradle fosse opcional, para tanto, é possível rodar as configurações do projeto após instalação do Java pelos arquivos &lt;strong&gt;gradle.bat&lt;/strong&gt; em sistemas Windows e &lt;strong&gt;gradlew&lt;/strong&gt; em sistemas Unix, que interagem com o arquivo &lt;strong&gt;gradle-wrapper.jar&lt;/strong&gt; contido na pasta &lt;strong&gt;gradle/wrapper&lt;/strong&gt; na raiz do projeto.&lt;/p&gt;

&lt;p&gt;Utilizando-se &lt;strong&gt;Maven&lt;/strong&gt; em projetos &lt;strong&gt;Springboot&lt;/strong&gt; com o &lt;a href="https://start.spring.io/"&gt;Initializr&lt;/a&gt; é possível chegar a um modelo semelhante.&lt;/p&gt;

&lt;p&gt;No caso do nosso projeto, mais configurações de &lt;strong&gt;Wrapper&lt;/strong&gt; podem ser encontradas dentro do arquivo &lt;strong&gt;build.gradle&lt;/strong&gt;, na raiz do mesmo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight groovy"&gt;&lt;code&gt;
&lt;span class="n"&gt;ext&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="n"&gt;gradleWrapperVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"6.6.1"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;wrapper&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="n"&gt;gradleVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$gradleWrapperVersion"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;É essa &lt;strong&gt;task&lt;/strong&gt; que interage com a versão do &lt;strong&gt;Gradle&lt;/strong&gt; do arquivo &lt;strong&gt;gradle-wrapper.jar&lt;/strong&gt; contido na pasta &lt;strong&gt;gradle/wrapper&lt;/strong&gt;. Atualizar a versão do &lt;strong&gt;Gradle&lt;/strong&gt; do meu projeto, neste caso, nada mais é que alterar a versão da dependência no meu &lt;strong&gt;ext&lt;/strong&gt; e depois interagir com a &lt;strong&gt;task wrapper&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Variáveis, afinal… é ou não é uma linguagem de programação?
&lt;/h2&gt;

&lt;p&gt;Outra vantagem que acho bem fera no &lt;strong&gt;Gradle&lt;/strong&gt; é a definição de variáveis e interação com elas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight groovy"&gt;&lt;code&gt;
&lt;span class="n"&gt;ext&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  

  &lt;span class="n"&gt;cordaVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"4.5"&lt;/span&gt;
  &lt;span class="n"&gt;cordaGroup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"net.corda"&lt;/span&gt;

  &lt;span class="n"&gt;libs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;corda&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
      &lt;span class="s2"&gt;"$cordaGroup:corda-core:$cordaVersion"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"$cordaGroup:corda-jackson:$cordaVersion"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"$cordaGroup:corda-node-api:$cordaVersion"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"$cordaGroup:corda-rpc:$cordaVersion"&lt;/span&gt;
    &lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="n"&gt;cordaCompile&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;corda&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O código acima trabalha com o conceito de compilação de dependências em lote… sabe aqueles imports que você precisava escrever linhas e linhas com o mesmo &lt;strong&gt;groupId&lt;/strong&gt; e &lt;strong&gt;version&lt;/strong&gt;? Pois bem, essa acho uma solução bem elegante para o problema… ela é uma evolução de uma outra abordagem que eu usava antes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight groovy"&gt;&lt;code&gt;
&lt;span class="n"&gt;ext&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="n"&gt;kotlinVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'1.3.31'&lt;/span&gt;

  &lt;span class="n"&gt;kotlinArtifacts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'kotlin-allopen'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'kotlin-noarg'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'kotlin-gradle-plugin'&lt;/span&gt;
  &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="n"&gt;kotlinArtifacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;classpath&lt;/span&gt; &lt;span class="s2"&gt;"org.jetbrains.kotlin:$a:$kotlinVersion"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Nesse segundo exemplo é possível ver uma coisa bem interessante, a diferença entre &lt;strong&gt;aspas simples&lt;/strong&gt; e &lt;strong&gt;aspas duplas&lt;/strong&gt; para o &lt;strong&gt;Groovy&lt;/strong&gt;. Resumindo-se, com &lt;strong&gt;aspas duplas&lt;/strong&gt; é possível fazer &lt;strong&gt;interpolação&lt;/strong&gt; de &lt;strong&gt;String&lt;/strong&gt;… vocês podem ver que eu tinha paciência para fazer isso antes, separando coisas com e sem interpolação :).&lt;/p&gt;

&lt;h2&gt;
  
  
  Definições externas
&lt;/h2&gt;

&lt;p&gt;Uma das coisas que acho mais fera no &lt;strong&gt;Gradle&lt;/strong&gt; é a possibilidade de separar configurações em mais de um lugar, utilizando o princípio de &lt;a href="https://en.wikipedia.org/wiki/Single-responsibility_principle"&gt;Separation of Concerns&lt;/a&gt; e o &lt;a href="https://en.wikipedia.org/wiki/Single-responsibility_principle"&gt;Simple Responsability Principle&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight groovy"&gt;&lt;code&gt;
&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/sonarqube.gradle"&lt;/span&gt;

&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allprojects&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;":application"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  

  &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/kotlin.gradle"&lt;/span&gt;
  &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/docs.gradle"&lt;/span&gt;
  &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/ides.gradle"&lt;/span&gt;
  &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/jacoco.gradle"&lt;/span&gt;
  &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/lint.gradle"&lt;/span&gt;
  &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;from:&lt;/span&gt; &lt;span class="s2"&gt;"$rootDir/plugins/security.gradle"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Dentro da raiz do projeto é possível perceber a pasta plugins, lá estão definidas as configurações que estou usando referentes a &lt;strong&gt;SonarQube&lt;/strong&gt;, &lt;strong&gt;Kotlin&lt;/strong&gt;, documentação, &lt;strong&gt;IDEs&lt;/strong&gt;, &lt;strong&gt;JaCoCo&lt;/strong&gt;, &lt;strong&gt;Lint&lt;/strong&gt; e &lt;strong&gt;Segurança&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Isso deixa meu &lt;strong&gt;build.gradle&lt;/strong&gt; muito mais limpo.&lt;/p&gt;

&lt;h2&gt;
  
  
  A estrutura do projeto
&lt;/h2&gt;

&lt;p&gt;Como dito, o &lt;strong&gt;Corda&lt;/strong&gt; tem um &lt;a href="https://github.com/corda"&gt;repositório bem interessante de exemplos&lt;/a&gt;. Mais para frente falaremos sobre o de &lt;a href="https://github.com/corda/samples-kotlin"&gt;Kotlin em especfico&lt;/a&gt;; mas uma coisa que me incomodava em outros projetos que eu pegava era que a separação de projetos ficava na mesma raiz do projeto principal… falarei um pouco mais sobre isso na &lt;strong&gt;Parte 7: Sobre desenvolvimento em Corda&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Uma forma que o &lt;strong&gt;Gradle&lt;/strong&gt; me ajudou com isso foi no arquivo &lt;strong&gt;settings.gradle&lt;/strong&gt;, em que sou bem livre para definir a arquitetura que eu quero usar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight groovy"&gt;&lt;code&gt;
&lt;span class="n"&gt;rootProject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ms-cambio"&lt;/span&gt;

&lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s1"&gt;'application:cordapp-flows'&lt;/span&gt;
&lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s1"&gt;'application:cordapp-contracts-states'&lt;/span&gt;
&lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s1"&gt;'application:rest-api'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Eu e meu brother &lt;a href="https://www.linkedin.com/in/igorcardosovieira/?lipi=urn%3Ali%3Apage%3Ad_flagship3_pulse_read%3BjBbKs09TT7Sau3GoZdPslw%3D%3D"&gt;Igor Vieira&lt;/a&gt;, o Igão da massa, havíamos nos aventurado em uma jornada com &lt;a href="https://reflectoring.io/spring-hexagonal/"&gt;Arquitetura Hexagonal&lt;/a&gt; em um dos nossos projetos na &lt;a href="https://www.aisdigital.com.br/"&gt;AIS Digital&lt;/a&gt;, a separação entre os projetos &lt;strong&gt;adapters-in&lt;/strong&gt;, &lt;strong&gt;adapters-out&lt;/strong&gt;, &lt;strong&gt;configuration&lt;/strong&gt; e &lt;strong&gt;core&lt;/strong&gt; foi o que me inspirou para essa organização acima.&lt;/p&gt;

&lt;p&gt;No meu caso, não posso falar que segui premissas de uma &lt;strong&gt;Arquitetura Hexagonal&lt;/strong&gt;, mas achei interessante a separação, deixando minhas camadas mais evidenciadas. Em uma solução no mundo real, talvez eu trabalhasse com mais de um repositório, um só para camada &lt;strong&gt;CorDapp&lt;/strong&gt;, outro para a camada de &lt;strong&gt;REST API&lt;/strong&gt; e outro para a camada de frontend… mas como dito no primeiro artigo, a separação entre &lt;strong&gt;REST API&lt;/strong&gt; e &lt;strong&gt;CorDapp&lt;/strong&gt; está &lt;strong&gt;mais para uma especulação por hora, dado eu estar ainda abstraindo os conceitos&lt;/strong&gt;… a camada de frontend sim, certeza que seria outro repositório.&lt;/p&gt;




&lt;p&gt;No demais é isso… nos encontraremos no próximo post em que falarei sobre &lt;strong&gt;README&lt;/strong&gt; e &lt;strong&gt;Documentação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E você tem alguma consideração sobre &lt;strong&gt;Corda&lt;/strong&gt;, &lt;strong&gt;Gradle&lt;/strong&gt;, &lt;strong&gt;Maven&lt;/strong&gt;, &lt;strong&gt;Kotlin&lt;/strong&gt;, &lt;strong&gt;Java&lt;/strong&gt; e quer trocar uma ideia? Só bora…&lt;/p&gt;




&lt;p&gt;Esse post faz parte de uma série sobre &lt;strong&gt;Corda Blockchain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A série completa é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/corda-blockchain-desafio-r3-pensamentos-sobre-minha-metodologia-de-aprender-algo-novo-introducao-4jnb"&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Introdução)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 1: Sobre Gradle)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arthurfnsc/corda-blockchain-desafio-r3-pensamentos-sobre-minha-metodologia-de-aprender-algo-novo-parte-2-sobre-documentacao-3cj8"&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 2: Sobre Documentação)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 3: Sobre Lint) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 4: Sobre Versões Desatualizadas de dependências) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 5: Sobre Vulnerabilidades de dependências) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 6: Sobre Github flow) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 7: Sobre desenvolvimento em Corda) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 8: Sobre testes em Corda) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 9: Sobre AssertJ) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 10: Sobre testes de arquitetura) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 11: Sobre testes de mutantes) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 12: Sobre JaCoCo) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 13: Sobre SonarQube) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 14: Sobre API First e OpenAPI 3) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 15: Sobre Springboot) [não publicado]&lt;/li&gt;
&lt;li&gt;Corda Blockchain | Desafio R3 — Pensamentos sobre minha metodologia de aprender algo novo (Parte 16: Sobre Mapstruct) [não publicado]&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Esse artigo foi escrito ouvindo-se &lt;strong&gt;3rd Root&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="100%" height="380px" src="https://open.spotify.com/embed/album/04BVBQ8MSTBwkL9q3pYcZp?si=vY8fzaj9SFGzZ2kV7RKKDg%20"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Original post published at &lt;a href="https://medium.com/@arthurfnsc/corda-blockchain-desafio-r3-pensamentos-sobre-minha-metodologia-de-aprender-algo-novo-parte-1-c7a43bfdad80"&gt;Medium&lt;/a&gt; on September 15th, 2020.&lt;/p&gt;

</description>
      <category>corda</category>
      <category>blockchain</category>
      <category>jvm</category>
      <category>gradle</category>
    </item>
  </channel>
</rss>
