Cursos que formaram meu caráter: Desenvolvimento web com Quarkus - Saudades do Maven, relatórios com Project-report
Tags: gradle, maven, quarkus, site
Published: 2022-12-14 20:42:10

---
title:  Cursos que formaram meu caráter: Desenvolvimento web com Quarkus - Saudades do Maven, relatórios com Project-report
published: true
description: O que aprendi com cursos realizados e como apliquei outras técnicas conhecidas para evoluí-los
tags: gradle, maven, quarkus, site
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m8uazy3rfnxc4ha6mn6r.jpg
# published_at: 2022-12-14 18:10 +0000
---

> "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](https://maven.apache.org/).

O ponto é como trazer diferentes perspectivas sobre o nosso projeto em um único lugar (o que não consegui com o [Gradle](https://gradle.org/)).

Esse artigo faz parte de uma série, abaixo é possível encontrar a [lista completa de artigos](#serie_completa).

Estamos nos baseando no curso [Desenvolvimento web com Quarkus](https://www.udemy.com/course/des-web-quarkus) do @viniciusfcf.

O repositório que estamos utilizando é:

{% embed https://gitlab.com/arthurfnsc-udemy/desenvolvimento-web-quarkus/ifood/ %}

---

## Tradeoffs

{% embed https://giphy.com/gifs/season-15-the-simpsons-15x18-l2Je7awyXi7rKeNLa %}

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](https://stackoverflow.com/users/1273394/tim) eu sei como você se sente:

{% embed https://stackoverflow.com/questions/30383304/maven-site-in-gradle %}

## Mas o que afinal de contas o Maven Site faz?

[Maven Site Plugin](https://maven.apache.org/plugins/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](https://github.com/junit-team/junit4), com o código escrito no **pom.xml** é possível chegar ao seguinte resultado:

{% embed https://junit.org/junit4/project-info.html %}

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](https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn) e voltando para a configuração do Maven, rodei o famoso:

```sh
foo@bar:~$ ./mvnw site
```

![Project Information](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3er3ieqh6n1el3fu7ncf.png)

![Dependency Convergence](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q9ahka18d6l1v0dw88ih.png)

![ Dependency Updates Report](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kprux15hxrq8lz0p1m3q.png)

![ Plugin Updates Report](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i827jws3ee949n7qyq02.png)

![ Property Updates Report](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/se1dqt29i2wscknczz7p.png)

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](https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na).

## Mas e com o Gradle?

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

{% embed https://docs.gradle.org/current/userguide/project_report_plugin.html %}

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

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

e em **plugins/docs.gradle**:

```groovy
...
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:

```sh

------------------------------------------------------------
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:

![htmlDependencyReport](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6n67jmwbkoaut2xrkm2b.png)

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

```sh
./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:

{% embed https://stackoverflow.com/questions/63088123/gradle-build-fails-with-out-of-memory-java-heap-space-error %}

---

## Conclusão

![Bad quality comparation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6m48lu8ap2ott2bclz1a.jpg)

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

---

<a name="serie_completa"></a>

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](https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-talk-is-cheap-show-me-the-code-2k91)
* [Utilizando Gradle ao invés de Maven](https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-utilizando-gradle-ao-inves-de-maven-1lcn)
* [Plugins do Gradle: Gerenciador de versões de bibliotecas com Versions](https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-gerenciador-de-versoes-de-bibliotecas-com-versions-9na)
* Plugins do Gradle: Saudades do  Maven, relatórios com Project-report
* [Plugins do Gradle: API First com o OpenAPI Generator](https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-42pm)
* [Plugins do Gradle: API First com o OpenAPI Generator para APIs reativas](https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-api-first-com-o-openapi-generator-para-apis-reativas-3o9b)
* [Plugins do Gradle: Validação de vulnerabilidades de dependências com OWASP Dependency Check](https://dev.to/arthurfnsc/cursos-que-formaram-meu-carater-desenvolvimento-web-com-quarkus-validacao-de-vulnerabilidades-com-owasp-dependency-check-2a2l)
* 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]