Cursos que formaram meu caráter: Desenvolvimento web com Quarkus — Saudades do Maven, relatórios com Project-report

Arthur Magalhaes Fonseca
6 min readDec 14, 2022

“Um site ruim é como um vendedor rabugento”. Jakob Nielsen

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 Maven.

O ponto é como trazer diferentes perspectivas sobre o nosso projeto em um único lugar (o que não consegui com o Gradle).

Esse artigo faz parte de uma série, abaixo é possível encontrar a lista completa de artigos.

Estamos nos baseando no curso Desenvolvimento web com Quarkus do Vinicius Ferraz Campos Florentino.

O repositório que estamos utilizando é:

Tradeoffs

I’m an orphan.

Sabe aquela conversa que o “nosso produto é melhor que o do concorrente em todos os aspectos”? Pois bem…

Brincadeiras à parte, o objetivo desse post está mais em enaltecer uma abordagem do Maven pouco utilizada para documentação.

É sr Tim eu sei como você se sente:

Mas o que afinal de contas o Maven Site faz?

Maven Site Plugin é 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.

Peguemos por exemplo o código do JUnit 4, com o código escrito no pom.xml é possível chegar ao seguinte resultado:

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.

Pela nostalgia voltei até aquele projeto que eu tinha falado no post sobre a mudança de Maven para Gradle e voltando para a configuração do Maven, rodei o famoso:

foo@bar:~$ ./mvnw site

Alguns reports interessantes são os de versão de dependências e plugins, que ficam mais bonitos que os nossos usando o Gradle Plugin Version.

Mas e com o Gradle?

Bom… como nem tudo são flores, o que consegui com o Gradle foi o plugin Project-Report:

A configuração dele está no build.gradle:

subprojects {
if (it.name != 'applications') {
...
apply from: "$rootDir/plugins/docs.gradle"
}
}

e em plugins/docs.gradle:

...

apply plugin: "project-report"

...

htmlDependencyReport {
projects = project.allprojects
}

Com ele, podemos executar a task dependencyReport, que gerará um report dentro da pasta build de cada subprojeto nosso como o seguinte:

------------------------------------------------------------
Project ':applications:cadastro'
------------------------------------------------------------

annotationProcessor - Annotation processors and their dependencies for source set 'main'.
+--- org.mapstruct:mapstruct-processor:1.5.3.Final
\--- 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
| | | \--- jakarta.ejb:jakarta.ejb-api:3.2.6
| | | \--- jakarta.transaction:jakarta.transaction-api:1.3.2 -> 1.3.3
| | \--- 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
| | | | | \--- io.smallrye.common:smallrye-common-constraint:1.13.1
| | | | | \--- org.jboss.logging:jboss-logging:3.4.3.Final -> 3.5.0.Final
| | | | \--- org.jboss.logging:jboss-logging:3.4.3.Final -> 3.5.0.Final
| | | +--- io.smallrye.common:smallrye-common-constraint:1.13.1 (*)
| | | +--- io.smallrye.common:smallrye-common-classloader:1.13.1
| | | +--- org.jboss.logging:jboss-logging:3.4.3.Final -> 3.5.0.Final
| | | +--- org.ow2.asm:asm:9.3
| | | \--- 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
| | | \--- org.jboss.logging:jboss-logging:3.4.3.Final -> 3.5.0.Final
| | \--- org.jboss.logging:jboss-logging:3.4.3.Final -> 3.5.0.Final
| +--- org.jboss.logging:jboss-logging:3.5.0.Final
| +--- org.jboss.logmanager:jboss-logmanager-embedded:1.0.11
| | \--- org.wildfly.common:wildfly-common:1.5.0.Final-format-001 -> 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 -> 3.5.0.Final
| | \--- org.wildfly.common:wildfly-common:1.5.0.Final -> 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 (*)
| | +--- org.jboss.logging:jboss-logging:3.5.0.Final
| | \--- io.github.crac:org-crac:0.1.1
| \--- io.quarkus:quarkus-fs-util:0.0.9

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

Temos a task htmlDependencyReport que gera um report em HTML dentro da pasta build de cada subprojeto nosso como o seguinte:

Um ponto que precisei alterar no nosso projeto foi a configuração org.gradle.jvmargs=-Xmx4096m em gradle.properties.


./gradlew clean htmlDependencyReport

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':applications:cadastro:htmlDependencyReport'.
> Java heap space

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 16s

Antes eu estava recebendo problemas de heap space no Java, para isso, aumentei a quantidade de RAM que o Gradle pode usar, como mencionado aqui:

Conclusão

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

Para quem usa o Gradle e conhecer algum outro plugin para a mesma finalidade, sou todo ouvidos.

Esse post faz parte de uma série sobre Cursos que formaram meu caráter: Desenvolvimento web com Quarkus.

A série completa é:

  • Talk is cheap show me the code
  • Utilizando Gradle ao invés de Maven
  • Plugins do Gradle: Gerenciador de versões de bibliotecas com Versions
  • Plugins do Gradle: Saudades do Maven, relatórios com Project-report
  • Plugins do Gradle: API First com o OpenAPI Generator
  • Plugins do Gradle: API First com o OpenAPI Generator para APIs reativas
  • Plugins do Gradle: Validação de vulnerabilidades de dependências com OWASP Dependency Check [não publicado]
  • Plugins do Gradle: Lint com Spotless [não publicado]
  • GitLab: Motivação para a escolha [não publicado]
  • GitLab: Considerações sobre o Prettier em pipelines [não publicado]
  • Gitmoji [não publicado]
  • SDK Man [não publicado]
  • Pré commit hook [não publicado]
  • application.yml: Utilizando YML em propriedades de aplicação [não publicado]
  • application.yml: Utilizando variáveis de ambiente [não publicado]
  • application.yml: Sobrescrevendo opções em teste [não publicado]
  • Mapstruct: Utilizando expressões para mapeamentos [não publicado]
  • Microprofile SecurityScheme: Sobrescrevendo tokenUrl [não publicado]
  • Prometheus: O problema simples que me custou algumas horas [não publicado]
  • quarkus-hibernate-reactive-panache: Utilizando as vantagens do Hibernate em projetos reativos [não publicado]
  • Testcontainers: Configuração para projetos reativos [não publicado]

Original post published at https://dev.to on December 14th, 2022.

--

--