<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>SalvaAí | Artigos</title><description>Artigos, manuais e notícias comentadas por João Pedro Ramos Campêlo: Java, tecnologia e o que mais valer a pena salvar.</description><link>https://www.salvaai.com.br/</link><language>pt-BR</language><fh:complete/><atom:link rel="self" href="https://www.salvaai.com.br/artigos/rss.xml"/><item><title>Desmistificando Docker e Kubernetes</title><link>https://www.salvaai.com.br/artigos/containers/containers/</link><guid isPermaLink="true">https://www.salvaai.com.br/artigos/containers/containers/</guid><description>Já ouviu falar em Docker e Kubernetes, mas ainda não sabe exatamente para que servem? 🐳 Entenda esses conceitos com analogias, exemplos práticos e uma jornada que vai do básico até a implantação e escalabilidade de aplicações.</description><pubDate>Sat, 20 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;docker-e-kubernetes-do-funciona-na-minha-máquina-até-aplicações-em-produção&quot;&gt;Docker e Kubernetes: do “funciona na minha máquina” até aplicações em produção&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Um guia para entender containers, orquestração e como aplicações modernas chegam ao mundo real, sem precisar invocar um DevOps para cada dúvida.&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;1-o-famoso-na-minha-máquina-funciona&quot;&gt;1. O famoso “na minha máquina funciona”&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Imagine a seguinte situação: você passou três dias desenvolvendo uma API incrível. Tudo funciona perfeitamente no seu computador. Os testes passam, o banco de dados responde, a aplicação inicia sem erros e você já está quase comemorando.&lt;/p&gt;
&lt;p&gt;Então chega o momento de colocar tudo em produção.&lt;/p&gt;
&lt;p&gt;Você envia o projeto para o servidor, executa a aplicação e… nada.&lt;/p&gt;
&lt;p&gt;Falta uma versão específica do Java. O servidor usa outra versão do Python. Uma biblioteca está desatualizada. Uma variável de ambiente não foi configurada. O banco de dados está em outra porta.&lt;/p&gt;
&lt;p&gt;E, como se não bastasse, alguém da equipe pergunta:&lt;/p&gt;
&lt;p&gt;“Mas você testou antes de enviar?”&lt;/p&gt;
&lt;p&gt;Você responde, com a serenidade de quem está prestes a abandonar a tecnologia:&lt;/p&gt;
&lt;p&gt;“Na minha máquina funcionava.”&lt;/p&gt;
&lt;p&gt;Essa situação é tão comum que praticamente virou um meme entre desenvolvedores. O problema é que ela representa uma dificuldade real: &lt;strong&gt;uma aplicação depende de muito mais do que apenas seu código-fonte para funcionar.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ela depende de uma linguagem, de bibliotecas, de configurações, de serviços externos e, em muitos casos, de versões específicas de cada componente.&lt;/p&gt;
&lt;p&gt;Foi para lidar melhor com esse tipo de problema que tecnologias como Docker ganharam tanta popularidade. E, quando precisamos gerenciar muitas aplicações e containers ao mesmo tempo, o Kubernetes entra em cena.&lt;/p&gt;
&lt;p&gt;Mas vamos por partes. Ninguém precisa aprender a pilotar um avião antes de entender como funciona um carro.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;2-primeiro-vamos-entender-o-que-é-o-docker&quot;&gt;2. Primeiro, vamos entender o que é o Docker&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Imagine que você precisa transportar uma geladeira, um sofá, uma televisão e algumas caixas para outra cidade.&lt;/p&gt;
&lt;p&gt;Você poderia colocar tudo em um caminhão de qualquer jeito, torcer para que nada caia e torcer ainda mais para que tudo chegue inteiro.&lt;/p&gt;
&lt;p&gt;Ou poderia organizar tudo em caixas padronizadas, identificadas e preparadas para serem transportadas de maneira previsível.&lt;/p&gt;
&lt;p&gt;No mundo do transporte de cargas, os containers físicos resolveram muitos problemas de padronização. Um container pode ser transportado por diferentes navios, caminhões e trens sem que seja necessário reorganizar toda a carga a cada troca de veículo.&lt;/p&gt;
&lt;p&gt;O Docker aplica uma ideia parecida ao desenvolvimento de software.&lt;/p&gt;
&lt;p&gt;Em vez de depender exclusivamente do ambiente em que a aplicação será executada, podemos empacotar o código com suas dependências e configurações necessárias em uma unidade chamada &lt;strong&gt;container&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Assim, a aplicação passa a ter um ambiente de execução muito mais previsível.&lt;/p&gt;
&lt;p&gt;É importante fazer uma distinção: o Docker não coloca absolutamente tudo dentro de uma caixa mágica. O kernel do sistema operacional, os serviços externos, os segredos e algumas configurações continuam dependendo do ambiente. O objetivo é reduzir as diferenças que costumam causar problemas.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;21-o-que-é-um-container&quot;&gt;2.1. O que é um container?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Um container é um ambiente isolado no qual um processo ou conjunto de processos executa, utilizando recursos do sistema operacional hospedeiro.&lt;/p&gt;
&lt;p&gt;Pense em um prédio comercial.&lt;/p&gt;
&lt;p&gt;Cada empresa possui seu próprio escritório, com seus funcionários, documentos e organização. Uma empresa não precisa conhecer todos os detalhes internos das outras para trabalhar.&lt;/p&gt;
&lt;p&gt;Os escritórios compartilham a estrutura do prédio, mas mantêm certo isolamento.&lt;/p&gt;
&lt;p&gt;Os containers funcionam de maneira semelhante. Eles podem executar aplicações separadamente, com seus próprios sistemas de arquivos, configurações e dependências, enquanto compartilham o kernel do sistema operacional.&lt;/p&gt;
&lt;p&gt;Isso traz uma vantagem importante: containers geralmente são mais leves do que máquinas virtuais tradicionais, porque não precisam inicializar um sistema operacional completo para cada instância.&lt;/p&gt;
&lt;p&gt;Uma observação técnica: o isolamento dos containers Linux utiliza recursos do kernel, como namespaces e cgroups. No Windows e no macOS, o Docker Desktop normalmente utiliza uma máquina virtual Linux para executar containers Linux.&lt;/p&gt;
&lt;p&gt;Ou seja, existe bastante engenharia por trás daquela caixinha que parece tão simples.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;22-container-não-é-a-mesma-coisa-que-máquina-virtual&quot;&gt;2.2. Container não é a mesma coisa que máquina virtual&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Essa é uma das primeiras diferenças que vale a pena entender.&lt;/p&gt;
&lt;p&gt;Uma máquina virtual normalmente executa seu próprio sistema operacional convidado sobre um hipervisor. Já um container compartilha o kernel do sistema operacional hospedeiro, embora tenha um ambiente isolado para executar sua aplicação.&lt;/p&gt;
&lt;p&gt;Imagine duas formas de hospedar empresas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Máquina virtual:&lt;/strong&gt; cada empresa aluga uma casa completa, com sua própria infraestrutura.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container:&lt;/strong&gt; cada empresa ocupa um escritório independente dentro de um prédio que compartilha parte da infraestrutura.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A casa completa oferece mais independência, mas demanda mais recursos. O escritório compartilhado tende a ser mais leve, embora dependa de uma infraestrutura comum.&lt;/p&gt;
&lt;p&gt;Isso não significa que containers sejam sempre melhores ou substituam máquinas virtuais em qualquer cenário. As tecnologias resolvem problemas diferentes e frequentemente são utilizadas juntas.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;3-antes-do-docker-precisamos-conhecer-três-conceitos&quot;&gt;3. Antes do Docker, precisamos conhecer três conceitos&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Para entender como o Docker funciona, precisamos separar três coisas: imagem, container e Dockerfile.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;31-imagem-a-receita-da-aplicação&quot;&gt;3.1. Imagem: a receita da aplicação&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Uma imagem Docker é um pacote imutável que contém os arquivos, as dependências e as instruções necessárias para criar containers.&lt;/p&gt;
&lt;p&gt;Imagine uma receita de bolo.&lt;/p&gt;
&lt;p&gt;A receita descreve os ingredientes e o modo de preparo. Você pode utilizá-la para preparar vários bolos sem precisar inventar tudo novamente.&lt;/p&gt;
&lt;p&gt;A imagem é a receita; o container é uma instância criada a partir dela.&lt;/p&gt;
&lt;p&gt;Por exemplo, podemos ter uma imagem de uma API Java e executar três containers a partir dessa mesma imagem. Cada container será uma instância separada da aplicação.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;32-container-a-receita-em-execução&quot;&gt;3.2. Container: a receita em execução&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Se a imagem é a receita, o container é o bolo que você efetivamente preparou.&lt;/p&gt;
&lt;p&gt;Tecnicamente, um container é uma instância executável de uma imagem, com seu próprio estado de execução e suas configurações.&lt;/p&gt;
&lt;p&gt;Você pode iniciar, parar, remover e recriar containers. Em aplicações bem projetadas, os dados importantes não devem depender exclusivamente do sistema de arquivos temporário do container. Para isso, podemos utilizar volumes, bancos de dados e serviços externos.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;33-dockerfile-as-instruções-para-construir-a-imagem&quot;&gt;3.3. Dockerfile: as instruções para construir a imagem&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;O Dockerfile é o arquivo no qual descrevemos como a imagem será construída.&lt;/p&gt;
&lt;p&gt;Vamos imaginar uma API Java com Spring Boot. Um Dockerfile simples poderia ser assim:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; eclipse-temurin:17-jre&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WORKDIR&lt;/span&gt;&lt;span&gt; /app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;COPY&lt;/span&gt;&lt;span&gt; target/app.jar app.jar&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;EXPOSE&lt;/span&gt;&lt;span&gt; 8080&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ENTRYPOINT&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;java&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;-jar&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;app.jar&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Vamos entender cada instrução:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;FROM&lt;/code&gt;: define a imagem-base utilizada na construção.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;WORKDIR&lt;/code&gt;: define o diretório de trabalho dentro da imagem.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;COPY&lt;/code&gt;: copia o arquivo JAR para esse diretório.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;EXPOSE&lt;/code&gt;: documenta a porta em que a aplicação espera receber conexões.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;ENTRYPOINT&lt;/code&gt;: define o processo principal executado quando o container inicia.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esse exemplo pressupõe que você já compilou a aplicação e gerou o arquivo &lt;code dir=&quot;auto&quot;&gt;target/app.jar&lt;/code&gt;. Também pressupõe que a aplicação realmente utiliza a porta 8080.&lt;/p&gt;
&lt;p&gt;Perceba que &lt;code dir=&quot;auto&quot;&gt;EXPOSE&lt;/code&gt; não publica a porta automaticamente para o seu computador. Para isso, precisamos configurar o mapeamento de portas ao executar o container.&lt;/p&gt;
&lt;p&gt;E pronto: já temos a estrutura básica de uma imagem Docker.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;4-colocando-a-mão-na-massa&quot;&gt;4. Colocando a mão na massa&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Vamos construir nossa primeira imagem.&lt;/p&gt;
&lt;p&gt;Considerando que o Docker esteja instalado e que o Dockerfile esteja na pasta do projeto, execute:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-t&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minha-api:1.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;O que aconteceu aqui?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;docker build&lt;/code&gt;: solicita a construção de uma imagem.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;-t minha-api:1.0&lt;/code&gt;: define o nome e a versão da imagem.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;.&lt;/code&gt;: informa que o diretório atual será utilizado como contexto de construção.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agora, podemos iniciar um container:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8080:8080&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;minha-api:1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A opção &lt;code dir=&quot;auto&quot;&gt;-d&lt;/code&gt; executa o container em segundo plano. A opção &lt;code dir=&quot;auto&quot;&gt;--name&lt;/code&gt; define seu nome, e &lt;code dir=&quot;auto&quot;&gt;-p 8080:8080&lt;/code&gt; mapeia a porta 8080 do computador para a porta 8080 do container.&lt;/p&gt;
&lt;p&gt;Se a aplicação estiver funcionando e aceitar requisições HTTP nessa porta, você poderá acessá-la em &lt;code dir=&quot;auto&quot;&gt;http://localhost:8080&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Alguns comandos úteis para o dia a dia:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Listar containers em execução&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Listar imagens disponíveis&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;images&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Consultar os logs da aplicação&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;logs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Parar o container&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Iniciar novamente&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Remover um container parado&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Experimente executar esses comandos. Aprender Docker não é muito diferente de aprender Git: a teoria ajuda, mas é quando você começa a executar comandos e cometer pequenos erros que as coisas passam a fazer sentido.&lt;/p&gt;
&lt;p&gt;Só não execute &lt;code dir=&quot;auto&quot;&gt;docker rm&lt;/code&gt; em produção sem entender o impacto, combinado?&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;5-e-se-minha-aplicação-precisar-de-um-banco-de-dados&quot;&gt;5. E se minha aplicação precisar de um banco de dados?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Aqui começa a ficar interessante.&lt;/p&gt;
&lt;p&gt;Imagine que você tem uma API Spring Boot que utiliza PostgreSQL. A aplicação funciona, mas precisa que o banco esteja disponível, com as credenciais corretas e com a configuração de rede adequada.&lt;/p&gt;
&lt;p&gt;Você poderia instalar tudo manualmente no computador de cada desenvolvedor. Poderia também configurar cada ambiente de testes individualmente.&lt;/p&gt;
&lt;p&gt;Ou poderia utilizar containers para executar os serviços necessários.&lt;/p&gt;
&lt;p&gt;Por exemplo, para iniciar um PostgreSQL local de testes:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;postgres-dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POSTGRES_DB=appdb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POSTGRES_USER=appuser&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POSTGRES_PASSWORD=devpassword&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5432:5432&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;postgres:16&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Esse comando cria um container PostgreSQL com um banco chamado &lt;code dir=&quot;auto&quot;&gt;appdb&lt;/code&gt; e um usuário chamado &lt;code dir=&quot;auto&quot;&gt;appuser&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A senha utilizada é apenas ilustrativa para um ambiente local. Não coloque credenciais reais em comandos compartilhados, arquivos versionados ou ambientes de produção.&lt;/p&gt;
&lt;p&gt;Existe outro detalhe importante: sem um volume persistente, os dados podem ser perdidos quando o container e sua camada gravável forem removidos. Em um ambiente real, precisamos planejar a persistência dos dados.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;51-docker-compose-quando-um-container-não-é-suficiente&quot;&gt;5.1. Docker Compose: quando um container não é suficiente&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Uma aplicação real raramente vive sozinha.&lt;/p&gt;
&lt;p&gt;Podemos ter uma API, um banco PostgreSQL, um Redis para cache e um serviço de mensageria. Gerenciar tudo separadamente começa a parecer uma mudança de apartamento em que cada pessoa transporta seus próprios móveis, mas ninguém sabe onde fica a chave da porta.&lt;/p&gt;
&lt;p&gt;O Docker Compose permite descrever vários serviços em um único arquivo e gerenciá-los em conjunto.&lt;/p&gt;
&lt;p&gt;Veja um exemplo simplificado:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;postgres:16&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;POSTGRES_DB&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;appdb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;POSTGRES_USER&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;appuser&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;devpassword&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;5432:5432&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;8080:8080&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;DB_HOST&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;DB_PORT&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;5432&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;DB_NAME&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;appdb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;DB_USER&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;appuser&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;DB_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;devpassword&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;postgres_data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Com esse arquivo salvo como &lt;code dir=&quot;auto&quot;&gt;compose.yaml&lt;/code&gt;, podemos executar:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--build&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;E encerrar os serviços com:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;down&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;O volume &lt;code dir=&quot;auto&quot;&gt;postgres_data&lt;/code&gt; mantém os dados do banco separados do ciclo de vida do container. Assim, o &lt;code dir=&quot;auto&quot;&gt;docker compose down&lt;/code&gt; padrão não remove esse volume nomeado.&lt;/p&gt;
&lt;p&gt;Note também que a API se conecta ao banco utilizando o nome do serviço &lt;code dir=&quot;auto&quot;&gt;db&lt;/code&gt;. O Compose cria uma rede para os serviços, permitindo que eles se comuniquem por seus nomes.&lt;/p&gt;
&lt;p&gt;Esse é um exemplo didático. Em um projeto real, a aplicação precisa estar preparada para receber essas variáveis, as credenciais devem ser tratadas corretamente e a inicialização precisa considerar que o banco pode demorar para ficar pronto.&lt;/p&gt;
&lt;p&gt;O &lt;code dir=&quot;auto&quot;&gt;depends_on&lt;/code&gt; básico organiza a ordem de inicialização, mas, sozinho, não garante que o banco já esteja aceitando conexões.&lt;/p&gt;
&lt;p&gt;Mesmo com essas ressalvas, o Compose já resolve uma grande parte dos problemas de desenvolvimento local.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;6-até-aqui-o-docker-resolveu-muita-coisa-mas-e-quando-o-sistema-cresce&quot;&gt;6. Até aqui, o Docker resolveu muita coisa. Mas e quando o sistema cresce?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Imagine que sua API começou como um pequeno projeto. Você tem poucos usuários, uma única instância e um servidor suficiente para executar tudo.&lt;/p&gt;
&lt;p&gt;Então o produto cresce.&lt;/p&gt;
&lt;p&gt;De repente, são milhares de usuários. Em alguns horários, o número de requisições aumenta bastante. Uma instância da aplicação deixa de ser suficiente, e você decide executar três.&lt;/p&gt;
&lt;p&gt;Até aqui, tudo bem.&lt;/p&gt;
&lt;p&gt;Mas então uma instância para de responder. Outra consome memória demais. Uma nova versão precisa ser implantada sem interromper os usuários. O servidor precisa ser substituído. O tráfego deve ser distribuído entre as instâncias.&lt;/p&gt;
&lt;p&gt;Agora imagine administrar tudo isso manualmente.&lt;/p&gt;
&lt;p&gt;Você precisaria acompanhar quais instâncias estão funcionando, iniciar novas quando necessário, substituir as que falharem e organizar a comunicação entre os serviços.&lt;/p&gt;
&lt;p&gt;É nesse momento que surge a pergunta:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quem vai administrar todos esses containers?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;O Docker permite executar e gerenciar containers, e existem ferramentas para automatizar boa parte desse trabalho. Uma das mais conhecidas é o Kubernetes.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;7-kubernetes-o-gerente-dos-containers&quot;&gt;7. Kubernetes: o gerente dos containers&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Pense no Kubernetes como o gerente de uma grande operação logística.&lt;/p&gt;
&lt;p&gt;O Docker ajuda a empacotar e executar aplicações em containers. O Kubernetes coordena a execução dessas aplicações em um conjunto de máquinas, buscando manter o sistema no estado desejado.&lt;/p&gt;
&lt;p&gt;Você não precisa dizer manualmente, a cada instante, qual container deve ser iniciado ou em qual máquina ele deve ficar. Em vez disso, descreve o que deseja que esteja funcionando, e o Kubernetes trabalha para alcançar e manter esse estado.&lt;/p&gt;
&lt;p&gt;Por exemplo, você pode declarar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quero três réplicas da minha API.&lt;/li&gt;
&lt;li&gt;Quero que elas sejam distribuídas entre os recursos disponíveis.&lt;/li&gt;
&lt;li&gt;Quero que novas réplicas sejam criadas se algumas falharem.&lt;/li&gt;
&lt;li&gt;Quero atualizar a aplicação gradualmente.&lt;/li&gt;
&lt;li&gt;Quero disponibilizar um endereço estável para acessar o serviço.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O Kubernetes utiliza controladores e outros componentes para reconciliar continuamente o estado observado com o estado desejado.&lt;/p&gt;
&lt;p&gt;Em outras palavras, ele não fica apenas esperando você perceber um problema. Ele tenta corrigir determinadas falhas automaticamente, de acordo com a configuração e os recursos disponíveis.&lt;/p&gt;
&lt;p&gt;Naturalmente, não é mágica. Se o banco de dados estiver indisponível, se não houver memória suficiente ou se a nova versão estiver quebrada, o Kubernetes não poderá simplesmente inventar recursos ou corrigir qualquer erro de código.&lt;/p&gt;
&lt;p&gt;Ele é um poderoso orquestrador, não um desenvolvedor sênior preso dentro do servidor.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;8-entendendo-os-principais-conceitos-do-kubernetes&quot;&gt;8. Entendendo os principais conceitos do Kubernetes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Antes de escrevermos nosso primeiro arquivo de configuração, vale conhecer alguns componentes.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;81-cluster&quot;&gt;8.1. Cluster&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Um cluster é o conjunto de máquinas e componentes que trabalham para executar as aplicações gerenciadas pelo Kubernetes.&lt;/p&gt;
&lt;p&gt;Ele possui, de maneira geral, dois grandes grupos de responsabilidades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control plane:&lt;/strong&gt; mantém o estado desejado do cluster, recebe as solicitações e coordena as decisões de gerenciamento.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Worker nodes:&lt;/strong&gt; são as máquinas nas quais as cargas de trabalho são executadas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O control plane inclui componentes como o API Server, o Scheduler e o Controller Manager. Em uma instalação típica, o etcd armazena o estado do cluster.&lt;/p&gt;
&lt;p&gt;Os worker nodes executam componentes como o kubelet, responsáveis por manter os workloads funcionando conforme as especificações recebidas.&lt;/p&gt;
&lt;p&gt;Em ambientes gerenciados, parte dessa infraestrutura pode ficar sob responsabilidade do provedor de nuvem.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;82-pod&quot;&gt;8.2. Pod&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;O Pod é a menor unidade implantável do Kubernetes.&lt;/p&gt;
&lt;p&gt;É comum ouvir que o Kubernetes executa containers, mas, tecnicamente, ele agenda Pods. Um Pod pode conter um ou mais containers que compartilham determinados recursos, como rede e volumes.&lt;/p&gt;
&lt;p&gt;Na maioria das aplicações web simples, um Pod contém um container principal.&lt;/p&gt;
&lt;p&gt;Imagine que o cluster é um condomínio e cada Pod é um apartamento reservado para uma unidade de trabalho. Os containers daquele Pod compartilham certos recursos, assim como moradores do mesmo apartamento compartilham a infraestrutura interna.&lt;/p&gt;
&lt;p&gt;Pods são recursos relativamente efêmeros. Se um Pod for substituído, o novo Pod poderá ter uma identidade diferente. Por isso, não devemos depender do endereço IP individual de um Pod como se fosse permanente.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;83-deployment&quot;&gt;8.3. Deployment&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;O Deployment descreve como uma aplicação deve ser executada e atualizada.&lt;/p&gt;
&lt;p&gt;Se você deseja manter três réplicas da sua API, pode declarar isso em um Deployment. Ele gerencia ReplicaSets, que, por sua vez, ajudam a manter a quantidade desejada de Pods.&lt;/p&gt;
&lt;p&gt;Veja um exemplo:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;apps/v1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Deployment&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;replicas&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;selector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;matchLabels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;labels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nginx:1.28&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;containerPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Esse exemplo utiliza o Nginx apenas para demonstrar a estrutura de um Deployment. Ele não é a nossa API Java e não implementa nenhuma lógica de negócio.&lt;/p&gt;
&lt;p&gt;O ponto principal está em &lt;code dir=&quot;auto&quot;&gt;replicas: 3&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Estamos declarando que desejamos três réplicas. O Kubernetes tentará manter essa quantidade de Pods em execução.&lt;/p&gt;
&lt;p&gt;Se um Pod desaparecer, o controlador poderá criar outro para substituí-lo, desde que existam recursos disponíveis e que as condições necessárias sejam atendidas.&lt;/p&gt;
&lt;p&gt;Isso é diferente de simplesmente executar três containers manualmente. Estamos declarando um estado desejado que o Kubernetes procura manter.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;84-service&quot;&gt;8.4. Service&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Se um Deployment cria e mantém Pods, como os outros componentes da aplicação encontram esses Pods?&lt;/p&gt;
&lt;p&gt;Lembre-se de que os Pods podem ser substituídos e seus endereços IP podem mudar.&lt;/p&gt;
&lt;p&gt;É aí que entra o Service.&lt;/p&gt;
&lt;p&gt;Um Service oferece um ponto de acesso estável para um conjunto de Pods selecionados por labels.&lt;/p&gt;
&lt;p&gt;Por exemplo:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;v1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;selector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;targetPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ClusterIP&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Esse Service seleciona os Pods que possuem a label &lt;code dir=&quot;auto&quot;&gt;app: minha-api&lt;/code&gt; e disponibiliza uma porta estável para acesso dentro do cluster.&lt;/p&gt;
&lt;p&gt;O tipo &lt;code dir=&quot;auto&quot;&gt;ClusterIP&lt;/code&gt; é o padrão e permite acesso interno. Para disponibilizar uma aplicação externamente, podemos utilizar outras configurações, como &lt;code dir=&quot;auto&quot;&gt;LoadBalancer&lt;/code&gt;, ou mecanismos de entrada HTTP/HTTPS.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;85-configmaps-e-secrets&quot;&gt;8.5. ConfigMaps e Secrets&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Aplicações precisam de configurações, como URLs de serviços, nomes de bancos e parâmetros de execução.&lt;/p&gt;
&lt;p&gt;O Kubernetes oferece dois recursos úteis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ConfigMap:&lt;/strong&gt; armazena configurações que não são confidenciais.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secret:&lt;/strong&gt; representa dados sensíveis, como senhas e tokens.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mas atenção: o nome &lt;code dir=&quot;auto&quot;&gt;Secret&lt;/code&gt; não significa que qualquer instalação estará automaticamente protegida contra acessos indevidos. É necessário configurar permissões, proteger o armazenamento do cluster e adotar práticas adequadas de gerenciamento de segredos.&lt;/p&gt;
&lt;p&gt;Não adianta usar Kubernetes para gerenciar sua infraestrutura e deixar a senha do banco escrita em um repositório público. Aí não é DevOps; é pedir para a internet fazer uma auditoria gratuita.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;9-colocando-o-kubernetes-em-prática&quot;&gt;9. Colocando o Kubernetes em prática&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Vamos aproveitar o Deployment que acabamos de criar.&lt;/p&gt;
&lt;p&gt;Em um cluster acessível pela ferramenta &lt;code dir=&quot;auto&quot;&gt;kubectl&lt;/code&gt;, salve o exemplo anterior como &lt;code dir=&quot;auto&quot;&gt;deployment.yaml&lt;/code&gt; e execute:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apply&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deployment.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Para verificar os Pods:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pods&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Para consultar o Deployment:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deployments&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Para inspecionar os detalhes de um Pod:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;describe&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NOME_DO_POD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Substitua &lt;code dir=&quot;auto&quot;&gt;NOME_DO_POD&lt;/code&gt; pelo nome retornado pelo comando anterior.&lt;/p&gt;
&lt;p&gt;Agora, suponha que você queira aumentar a quantidade de réplicas para cinco:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deployment&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--replicas=5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;O Kubernetes tentará ajustar a quantidade de Pods ao novo estado desejado.&lt;/p&gt;
&lt;p&gt;Para observar o resultado:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pods&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Você verá o processo de criação das novas réplicas. O tempo necessário depende do ambiente, da disponibilidade dos recursos e das imagens utilizadas.&lt;/p&gt;
&lt;p&gt;Uma observação importante: o Deployment de exemplo usa Nginx e a porta 80. Ele não precisa de uma imagem Java para funcionar como demonstração, mas uma aplicação real exigiria uma imagem própria e uma configuração adequada.&lt;/p&gt;
&lt;p&gt;Também não criamos o Service automaticamente nesse processo. Para aplicar o Service mostrado anteriormente, salve-o em outro arquivo, como &lt;code dir=&quot;auto&quot;&gt;service.yaml&lt;/code&gt;, e execute:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apply&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;service.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Se quiser testar o acesso ao Nginx localmente em um cluster de desenvolvimento, pode utilizar:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;port-forward&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;service/minha-api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8080:80&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Depois, acesse &lt;code dir=&quot;auto&quot;&gt;http://localhost:8080&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Esse encaminhamento é útil para testes e depuração, mas não substitui uma estratégia de exposição de serviços em produção.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;10-como-o-kubernetes-lida-com-falhas&quot;&gt;10. Como o Kubernetes lida com falhas?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Imagine que uma das três réplicas da sua API pare de funcionar.&lt;/p&gt;
&lt;p&gt;Em um cenário bem configurado, o Kubernetes pode detectar que o Pod deixou de existir e criar outro para manter a quantidade desejada.&lt;/p&gt;
&lt;p&gt;Mas existem diferentes tipos de falha, e cada um exige mecanismos apropriados.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;liveness-probe-a-aplicação-continua-viva&quot;&gt;Liveness probe: a aplicação continua viva?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A liveness probe ajuda a identificar quando um container precisa ser reiniciado.&lt;/p&gt;
&lt;p&gt;Se uma aplicação ficar travada e não conseguir se recuperar sozinha, uma probe configurada corretamente pode permitir que o Kubernetes reinicie o container.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;readiness-probe-a-aplicação-está-pronta-para-receber-tráfego&quot;&gt;Readiness probe: a aplicação está pronta para receber tráfego?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Uma aplicação pode estar em execução, mas ainda não estar pronta para atender requisições.&lt;/p&gt;
&lt;p&gt;Ela pode estar inicializando, carregando configurações ou aguardando uma dependência essencial.&lt;/p&gt;
&lt;p&gt;A readiness probe ajuda a determinar se o container está pronto para receber tráfego. Quando não está, o Kubernetes pode deixar de encaminhar requisições para aquele Pod por meio dos mecanismos de serviço.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;startup-probe-a-aplicação-terminou-de-iniciar&quot;&gt;Startup probe: a aplicação terminou de iniciar?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Algumas aplicações demoram mais para inicializar. Uma startup probe permite acomodar esse período sem que verificações de liveness prematuras provoquem reinicializações desnecessárias.&lt;/p&gt;
&lt;p&gt;Essas três verificações têm objetivos diferentes. Configurá-las corretamente é mais importante do que simplesmente adicioná-las ao YAML para deixar o arquivo com aparência profissional.&lt;/p&gt;
&lt;p&gt;E vale lembrar: reiniciar uma aplicação não resolve um bug permanente. Se o processo falhar sempre que recebe determinada requisição, o Kubernetes poderá reiniciá-lo repetidamente sem corrigir a causa.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;11-escalabilidade-mais-usuários-mais-capacidade&quot;&gt;11. Escalabilidade: mais usuários, mais capacidade&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Uma das vantagens do Kubernetes é facilitar a ampliação da quantidade de réplicas de uma aplicação.&lt;/p&gt;
&lt;p&gt;Mas precisamos distinguir duas coisas:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Escalabilidade horizontal:&lt;/strong&gt; adicionar ou remover instâncias da aplicação.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Escalabilidade vertical:&lt;/strong&gt; aumentar ou reduzir os recursos destinados a uma instância, como CPU e memória.&lt;/p&gt;
&lt;p&gt;O Kubernetes pode ajudar nas duas estratégias, dependendo da configuração.&lt;/p&gt;
&lt;p&gt;No caso horizontal, o Horizontal Pod Autoscaler (HPA) pode ajustar o número de réplicas de um Deployment ou de outro recurso compatível, utilizando métricas como utilização de CPU e memória ou métricas personalizadas.&lt;/p&gt;
&lt;p&gt;Por exemplo, você pode definir um intervalo de duas a dez réplicas para uma API.&lt;/p&gt;
&lt;p&gt;Isso não significa que o HPA aumentará automaticamente a quantidade de instâncias sempre que houver muitos usuários. O comportamento depende das métricas disponíveis, das metas configuradas e da capacidade do cluster.&lt;/p&gt;
&lt;p&gt;Além disso, se todos os nós estiverem sem recursos, solicitar mais Pods não fará surgir memória do nada. Será necessário ter capacidade disponível ou utilizar mecanismos de escalabilidade da infraestrutura, como um autoscaler de nós, quando disponível.&lt;/p&gt;
&lt;p&gt;Escalar não é apenas multiplicar containers. É garantir que a aplicação, o banco de dados, a rede e os demais componentes consigam acompanhar o crescimento.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;12-docker-e-kubernetes-são-concorrentes&quot;&gt;12. Docker e Kubernetes são concorrentes?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Não exatamente. Essa é uma confusão comum entre quem está começando.&lt;/p&gt;
&lt;p&gt;O Docker é uma plataforma e um conjunto de ferramentas para construir imagens, executar containers e gerenciar o ciclo de vida deles.&lt;/p&gt;
&lt;p&gt;O Kubernetes é uma plataforma de orquestração que coordena aplicações em containers em um cluster.&lt;/p&gt;
&lt;p&gt;Eles atuam em níveis diferentes e podem fazer parte da mesma arquitetura.&lt;/p&gt;
&lt;p&gt;Existe, porém, um detalhe técnico importante: &lt;strong&gt;o Kubernetes moderno não depende do Docker Engine para executar containers nos nós do cluster.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ele utiliza uma interface chamada Container Runtime Interface (CRI), que permite integrar runtimes compatíveis, como o containerd e o CRI-O.&lt;/p&gt;
&lt;p&gt;O Docker Engine não implementa diretamente essa interface da forma exigida pelo Kubernetes moderno. Por isso, o antigo dockershim foi removido do Kubernetes a partir da versão 1.24.&lt;/p&gt;
&lt;p&gt;Isso não significa que você deva abandonar o Docker.&lt;/p&gt;
&lt;p&gt;Você continua podendo utilizar Docker para construir imagens, testar aplicações localmente e publicar imagens em um registry. Essas imagens podem ser executadas no Kubernetes por meio de runtimes compatíveis.&lt;/p&gt;
&lt;p&gt;Em resumo: você pode construir sua aplicação com Docker e executá-la no Kubernetes sem precisar utilizar o Docker Engine como runtime dos nós.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;13-e-onde-entra-o-cicd&quot;&gt;13. E onde entra o CI/CD?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Até agora, construímos imagens e aplicamos configurações manualmente. Em um projeto real, queremos que o processo de entrega seja repetível, seguro e, sempre que possível, automatizado.&lt;/p&gt;
&lt;p&gt;É aqui que entram CI e CD.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CI (Continuous Integration):&lt;/strong&gt; automatiza atividades como compilação, testes e validações durante a integração das mudanças.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CD (Continuous Delivery ou Continuous Deployment):&lt;/strong&gt; automatiza etapas de preparação e entrega de software. Dependendo da estratégia, a publicação pode exigir aprovação ou ocorrer automaticamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Imagine que você enviou uma alteração para o repositório da sua API Java.&lt;/p&gt;
&lt;p&gt;Um pipeline poderia executar as seguintes etapas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Baixar o código do repositório.&lt;/li&gt;
&lt;li&gt;Compilar a aplicação com Maven.&lt;/li&gt;
&lt;li&gt;Executar os testes automatizados.&lt;/li&gt;
&lt;li&gt;Construir a imagem Docker.&lt;/li&gt;
&lt;li&gt;Publicar a imagem em um registry.&lt;/li&gt;
&lt;li&gt;Atualizar o Deployment no Kubernetes.&lt;/li&gt;
&lt;li&gt;Acompanhar a implantação e verificar se a nova versão ficou saudável.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ferramentas como GitHub Actions, GitLab CI e Jenkins podem automatizar partes desse processo.&lt;/p&gt;
&lt;p&gt;O Kubernetes, por sua vez, oferece mecanismos de atualização gradual. Em um Deployment, uma nova versão pode substituir a anterior progressivamente, de acordo com a estratégia configurada.&lt;/p&gt;
&lt;p&gt;Isso ajuda a reduzir interrupções, mas não garante que toda implantação será segura. É preciso considerar compatibilidade entre versões, alterações no banco de dados, monitoramento e estratégias de reversão.&lt;/p&gt;
&lt;p&gt;Afinal, automatizar um erro não faz dele uma boa prática. Apenas faz com que ele aconteça mais rápido.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;14-os-problemas-que-aparecem-quando-você-chega-à-produção&quot;&gt;14. Os problemas que aparecem quando você chega à produção&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Aprender os comandos básicos é apenas o começo. Em ambientes reais, a complexidade está nos detalhes.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;segurança-das-imagens&quot;&gt;Segurança das imagens&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Utilize imagens confiáveis, mantenha-as atualizadas, evite executar processos como root quando não for necessário e verifique vulnerabilidades nas dependências.&lt;/p&gt;
&lt;p&gt;Uma imagem pequena e atualizada pode reduzir a superfície de ataque, mas não elimina todos os riscos.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;limites-de-cpu-e-memória&quot;&gt;Limites de CPU e memória&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;É importante configurar requests e limits de recursos de acordo com as necessidades da aplicação.&lt;/p&gt;
&lt;p&gt;Requests ajudam o Kubernetes a decidir onde agendar os Pods. Limits estabelecem restrições de utilização de determinados recursos, conforme o tipo de recurso e a configuração.&lt;/p&gt;
&lt;p&gt;Valores mal definidos podem prejudicar o desempenho, causar falta de recursos ou provocar reinicializações por falta de memória.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;persistência-dos-dados&quot;&gt;Persistência dos dados&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Containers e Pods podem ser substituídos. Por isso, bancos de dados e outros serviços com estado exigem planejamento específico para armazenamento, backup, recuperação e disponibilidade.&lt;/p&gt;
&lt;p&gt;Executar um PostgreSQL em um container é perfeitamente possível. Administrar um PostgreSQL crítico em produção, entretanto, envolve muito mais do que iniciar esse container.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;observabilidade&quot;&gt;Observabilidade&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Quando uma aplicação falha, você precisa descobrir por quê.&lt;/p&gt;
&lt;p&gt;Logs ajudam a entender os eventos. Métricas ajudam a acompanhar consumo de recursos, latência e taxas de erro. Traces distribuídos ajudam a seguir requisições que passam por vários serviços.&lt;/p&gt;
&lt;p&gt;Sem observabilidade, seu cluster pode até estar funcionando, mas você estará administrando tudo no escuro.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;alta-disponibilidade&quot;&gt;Alta disponibilidade&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Executar três réplicas não garante, por si só, alta disponibilidade.&lt;/p&gt;
&lt;p&gt;Se todas estiverem no mesmo nó e esse nó falhar, as três podem ficar indisponíveis ao mesmo tempo.&lt;/p&gt;
&lt;p&gt;Distribuição entre nós, redundância, capacidade disponível, armazenamento, rede e dependências externas precisam ser considerados no desenho da arquitetura.&lt;/p&gt;
&lt;p&gt;Alta disponibilidade é uma propriedade do sistema como um todo, não uma opção mágica no arquivo YAML.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;15-você-realmente-precisa-de-kubernetes&quot;&gt;15. Você realmente precisa de Kubernetes?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Depois de tudo isso, talvez você esteja pensando:&lt;/p&gt;
&lt;p&gt;“Legal, mas preciso aprender Kubernetes para publicar minha API?”&lt;/p&gt;
&lt;p&gt;A resposta honesta é: depende.&lt;/p&gt;
&lt;p&gt;Para uma aplicação pequena, um Dockerfile e um Docker Compose podem ser suficientes. Uma API com pouco tráfego talvez funcione muito bem em um serviço de hospedagem que cuide da infraestrutura para você.&lt;/p&gt;
&lt;p&gt;O Kubernetes começa a fazer mais sentido quando há necessidades concretas de orquestração, escalabilidade, padronização de deploys, gerenciamento de vários serviços ou operação de aplicações distribuídas.&lt;/p&gt;
&lt;p&gt;Por outro lado, ele também traz custos: complexidade operacional, configuração, monitoramento, segurança e manutenção.&lt;/p&gt;
&lt;p&gt;Não é raro ver equipes pequenas adotando Kubernetes antes de realmente precisarem dele e gastando mais tempo administrando a infraestrutura do que desenvolvendo o produto.&lt;/p&gt;
&lt;p&gt;É como comprar um caminhão de mudança para transportar uma mochila. É possível, mas talvez você esteja complicando um problema simples.&lt;/p&gt;
&lt;p&gt;A melhor arquitetura não é a que utiliza mais tecnologias. É a que resolve o problema com um nível de complexidade compatível com as necessidades do projeto.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;16-um-roteiro-para-continuar-aprendendo&quot;&gt;16. Um roteiro para continuar aprendendo&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Se você está começando, recomendo seguir uma sequência gradual:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Etapa 1: Fundamentos de containers&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instale o Docker.&lt;/li&gt;
&lt;li&gt;Aprenda imagens, containers, volumes e redes.&lt;/li&gt;
&lt;li&gt;Construa uma imagem para uma aplicação simples.&lt;/li&gt;
&lt;li&gt;Pratique os comandos &lt;code dir=&quot;auto&quot;&gt;build&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;run&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;ps&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;logs&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;stop&lt;/code&gt; e &lt;code dir=&quot;auto&quot;&gt;rm&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Etapa 2: Aplicações com vários serviços&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crie uma API REST.&lt;/li&gt;
&lt;li&gt;Conecte-a a um PostgreSQL.&lt;/li&gt;
&lt;li&gt;Utilize Docker Compose.&lt;/li&gt;
&lt;li&gt;Configure variáveis de ambiente e volumes.&lt;/li&gt;
&lt;li&gt;Aprenda a investigar falhas de conexão.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Etapa 3: Primeiros passos com Kubernetes&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilize um ambiente local, como Kind, Minikube ou outro cluster de desenvolvimento.&lt;/li&gt;
&lt;li&gt;Aprenda Pods, Deployments e Services.&lt;/li&gt;
&lt;li&gt;Pratique com &lt;code dir=&quot;auto&quot;&gt;kubectl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Entenda ConfigMaps, Secrets e probes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Etapa 4: Preparação para produção&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure requests e limits.&lt;/li&gt;
&lt;li&gt;Estude HPA, estratégias de atualização e recuperação.&lt;/li&gt;
&lt;li&gt;Aprenda conceitos de segurança, observabilidade e armazenamento persistente.&lt;/li&gt;
&lt;li&gt;Automatize testes e deploys com CI/CD.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Etapa 5: Arquitetura e operação&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Estude redes, DNS, ingress e balanceamento de carga.&lt;/li&gt;
&lt;li&gt;Entenda a distribuição de workloads entre nós.&lt;/li&gt;
&lt;li&gt;Explore Helm, GitOps e políticas de segurança.&lt;/li&gt;
&lt;li&gt;Aprenda a diagnosticar problemas em sistemas distribuídos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Você não precisa dominar todas essas ferramentas de uma vez. O objetivo é compreender o problema que cada uma resolve e aprender a utilizá-las quando fizerem sentido.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;conclusão-menos-improviso-mais-previsibilidade&quot;&gt;Conclusão: menos improviso, mais previsibilidade&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Docker e Kubernetes representam duas partes importantes da evolução na maneira como desenvolvemos e operamos software.&lt;/p&gt;
&lt;p&gt;O Docker ajuda a empacotar aplicações em ambientes reproduzíveis, reduzindo diferenças entre desenvolvimento, testes e produção.&lt;/p&gt;
&lt;p&gt;O Kubernetes permite coordenar aplicações em containers, administrar réplicas, responder a determinadas falhas e automatizar tarefas de operação em clusters.&lt;/p&gt;
&lt;p&gt;Mas a lição mais importante não é decorar comandos ou aprender a escrever arquivos YAML de cabeça.&lt;/p&gt;
&lt;p&gt;É entender que &lt;strong&gt;software não termina quando o código funciona no computador do desenvolvedor&lt;/strong&gt;. Ele precisa ser construído, distribuído, executado, monitorado, atualizado e recuperado quando algo dá errado.&lt;/p&gt;
&lt;p&gt;Docker ajuda a tornar a execução mais previsível. Kubernetes ajuda a administrar a complexidade quando a operação cresce.&lt;/p&gt;
&lt;p&gt;E, se depois de tudo isso alguém disser que a aplicação funciona apenas na máquina dele, você já terá algumas perguntas melhores para fazer.&lt;/p&gt;
&lt;p&gt;A primeira talvez seja:&lt;/p&gt;
&lt;p&gt;“Beleza. E qual imagem você utilizou?”&lt;/p&gt;
&lt;p&gt;Porque, convenhamos, “na minha máquina funciona” pode até ser uma boa desculpa. Mas, em produção, não deveria ser uma estratégia de arquitetura.&lt;/p&gt;
</content:encoded><category>docker</category><category>kubernetes</category><category>devops</category><category>containers</category><category>fundamentos</category></item><item><title>Maven, o nosso orquestrador</title><link>https://www.salvaai.com.br/artigos/java/maven/</link><guid isPermaLink="true">https://www.salvaai.com.br/artigos/java/maven/</guid><description>Se você já viu o pom.xml mas nunca entendeu o que significa, vem comigo!</description><pubDate>Sun, 21 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;maven-o-que-é-e-por-que-todo-desenvolvedor-java-deveria-conhecê-lo&quot;&gt;Maven: o que é e por que todo desenvolvedor Java deveria conhecê-lo&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Provavelmente já encontrou um arquivo chamado &lt;code dir=&quot;auto&quot;&gt;pom.xml&lt;/code&gt; em algum projeto.&lt;/p&gt;
&lt;p&gt;Talvez também tenha visto comandos como:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;ou:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;spring-boot:run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Mas afinal, &lt;strong&gt;o que é o Maven?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;De forma simples, o &lt;strong&gt;Apache Maven é uma ferramenta de automação de build e gerenciamento de projetos Java&lt;/strong&gt;. Ele ajuda a baixar bibliotecas, compilar o código, executar testes, empacotar a aplicação e até publicar artefatos.&lt;/p&gt;
&lt;p&gt;Mas essa definição ainda não explica por que ele é tão presente no ecossistema Java.&lt;/p&gt;
&lt;p&gt;Para entender isso, precisamos voltar um pouco.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;o-problema-que-o-maven-resolve&quot;&gt;O problema que o Maven resolve&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Imagine que você está criando uma API Java.&lt;/p&gt;
&lt;p&gt;Seu projeto precisa de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spring Boot - Facilita a criação de aplicações independentes;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PostgreSQL - Gerenciamento de banco de dados relacional;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JUnit - Framework padrão para testes unitários em Java;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mockito - Biblioteca de simulação para Java;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jackson - Biblioteca Java para processamento de dados JSON;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hibernate - Framework de mapeamento (ORM) para Java.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Todas essas bibliotecas são arquivos &lt;code dir=&quot;auto&quot;&gt;.jar&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sem uma ferramenta de gerenciamento de dependências, você teria que:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;procurar cada biblioteca;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;baixar os arquivos &lt;code dir=&quot;auto&quot;&gt;.jar&lt;/code&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;colocá-los no projeto;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;descobrir quais outras bibliotecas elas precisam;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;resolver conflitos entre versões;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;configurar o classpath;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;repetir tudo isso quando alguma biblioteca fosse atualizada.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;E aqui aparece um problema ainda maior.&lt;/p&gt;
&lt;p&gt;Imagine que o Spring Boot dependa de uma biblioteca A, que depende da biblioteca B, que depende da biblioteca C.&lt;/p&gt;
&lt;p&gt;Você realmente quer descobrir e baixar todas essas dependências manualmente?&lt;/p&gt;
&lt;p&gt;É justamente nesse tipo de situação que o Maven começa a fazer sentido.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;plus-o-que-é-uma-biblioteca-lib&quot;&gt;Plus: O que é uma biblioteca (Lib)?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Uma biblioteca, no sentido geral, é uma coleção de classes que fornecem ferramentas para que você, como desenvolvedor, não precise escrever essas ferramentas.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;o-que-é-o-maven&quot;&gt;O que é o Maven?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;O &lt;strong&gt;Apache Maven&lt;/strong&gt; é uma ferramenta de build para projetos Java.&lt;/p&gt;
&lt;p&gt;Segundo a própria documentação do projeto, ele utiliza um &lt;strong&gt;Project Object Model (POM)&lt;/strong&gt; para gerenciar aspectos como compilação, testes e documentação do projeto.&lt;/p&gt;
&lt;p&gt;Na prática, o Maven ajuda a padronizar tarefas que aparecem constantemente no desenvolvimento Java:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Compilação&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Testes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Empacotamento&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Artefato&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Por exemplo, uma aplicação pode terminar como:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;meu-projeto.jar&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;O Maven consegue cuidar de grande parte desse processo.&lt;/p&gt;
&lt;p&gt;Mas talvez a funcionalidade mais conhecida seja outra:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Gerenciar as dependências do projeto.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;o-pomxml&quot;&gt;O &lt;code dir=&quot;auto&quot;&gt;pom.xml&lt;/code&gt;&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Quando você cria um projeto Maven, um dos arquivos mais importantes é:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pom.xml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;POM significa:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Project Object Model&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ele é o arquivo central de configuração do Maven.&lt;/p&gt;
&lt;p&gt;É nele que podemos definir informações como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;nome do projeto;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;versão;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java utilizado;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;dependências;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;plugins;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tipo de empacotamento;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;configurações de build;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;informações do projeto.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Um exemplo simples:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;modelVersion&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;4.0.0&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;modelVersion&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;br.com.exemplo&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1.0.0&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Esse arquivo funciona como uma espécie de &lt;strong&gt;contrato do projeto com o Maven&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;O Maven lê o &lt;code dir=&quot;auto&quot;&gt;pom.xml&lt;/code&gt; e, a partir dessas informações, sabe como trabalhar com o projeto.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;entendendo-groupid-artifactid-e-version&quot;&gt;Entendendo &lt;code dir=&quot;auto&quot;&gt;groupId&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;artifactId&lt;/code&gt; e &lt;code dir=&quot;auto&quot;&gt;version&lt;/code&gt;&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Você provavelmente verá esses três elementos em praticamente todo projeto Maven.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;br.com.exemplo&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1.0.0&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Eles identificam o projeto.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;groupid&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;groupId&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Normalmente representa a organização ou grupo responsável pelo projeto.&lt;/p&gt;
&lt;p&gt;Por exemplo:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;com.google.guava&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;ou:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;br.com.salvaai&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;artifactid&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;artifactId&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;É o nome do artefato/projeto.&lt;/p&gt;
&lt;p&gt;Por exemplo:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;minha-api&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;version&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;version&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Representa a versão:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1.0.0&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Juntos, esses valores formam as chamadas &lt;strong&gt;coordenadas Maven&lt;/strong&gt; de um artefato.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;e-as-dependências&quot;&gt;E as dependências?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Agora chegamos a uma das partes mais importantes.&lt;/p&gt;
&lt;p&gt;Suponha que nossa aplicação precise do Spring Web.&lt;/p&gt;
&lt;p&gt;Em vez de baixar manualmente um &lt;code dir=&quot;auto&quot;&gt;.jar&lt;/code&gt;, podemos declarar a dependência no &lt;code dir=&quot;auto&quot;&gt;pom.xml&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;dependency&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;org.springframework.boot&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;spring-boot-starter-web&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;3.5.6&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;dependency&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A partir disso, o Maven consegue resolver e baixar a dependência necessária.&lt;/p&gt;
&lt;p&gt;E existe uma característica extremamente importante:&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;dependências-transitivas&quot;&gt;Dependências transitivas&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Imagine:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Minha aplicação&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Biblioteca A&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Biblioteca B&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Biblioteca C&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Se a Biblioteca A precisa da Biblioteca B, que por sua vez precisa da Biblioteca C, o Maven consegue resolver essas dependências transitivamente.&lt;/p&gt;
&lt;p&gt;Ou seja, você não precisa declarar manualmente cada biblioteca necessária por suas dependências.&lt;/p&gt;
&lt;p&gt;É uma das razões pelas quais gerenciar projetos Java grandes seria muito mais trabalhoso sem uma ferramenta como o Maven.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;de-onde-o-maven-baixa-as-bibliotecas&quot;&gt;De onde o Maven baixa as bibliotecas?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Você pode imaginar que existe uma enorme biblioteca online contendo milhares de artefatos Java.&lt;/p&gt;
&lt;p&gt;Esse papel é desempenhado principalmente pelo &lt;strong&gt;Maven Central Repository&lt;/strong&gt;, um dos principais repositórios públicos de dependências do ecossistema Java.&lt;/p&gt;
&lt;p&gt;Quando você adiciona uma dependência ao &lt;code dir=&quot;auto&quot;&gt;pom.xml&lt;/code&gt;, o Maven procura o artefato nos repositórios configurados e pode armazená-lo no seu repositório local.&lt;/p&gt;
&lt;p&gt;Por isso, depois de baixar uma dependência uma vez, ela normalmente não precisa ser baixada novamente para cada projeto.&lt;/p&gt;
&lt;p&gt;O fluxo pode ser entendido assim:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pom.xml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Maven&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Repositório remoto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Dependência&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Repositório local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Projeto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;o-repositório-local&quot;&gt;O repositório local&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;O Maven mantém um repositório local na máquina do desenvolvedor.&lt;/p&gt;
&lt;p&gt;No Linux e macOS, normalmente ele fica em:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;~/.m2/repository&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;No Windows:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;C:\Users\SEU_USUARIO\.m2\repository&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Imagine que você utilize:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;junit-jupiter&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Depois que o Maven baixa essa dependência, ela fica disponível no repositório local.&lt;/p&gt;
&lt;p&gt;Isso também ajuda a evitar downloads desnecessários.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;o-ciclo-de-vida-do-maven&quot;&gt;O ciclo de vida do Maven&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Outra ideia fundamental do Maven é o &lt;strong&gt;Build Lifecycle&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Em vez de cada projeto inventar seus próprios comandos e etapas de build, o Maven possui ciclos de vida padronizados.&lt;/p&gt;
&lt;p&gt;O ciclo &lt;code dir=&quot;auto&quot;&gt;default&lt;/code&gt;, por exemplo, possui várias fases.&lt;/p&gt;
&lt;p&gt;Algumas das mais conhecidas são:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;validate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;test&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;verify&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Cada fase representa uma etapa do processo de construção do projeto.&lt;/p&gt;
&lt;p&gt;Vamos entender algumas delas.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;compile&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;compile&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Compila o código-fonte.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;test&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;test&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Executa os testes.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;package&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;package&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Empacota a aplicação.&lt;/p&gt;
&lt;p&gt;Por exemplo:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;target/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└── minha-api-1.0.0.jar&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Com:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;install&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;install&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Além de construir o artefato, instala o resultado no repositório local.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;deploy&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;deploy&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Pode publicar o artefato em um repositório remoto configurado.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Essas fases são executadas em sequência.&lt;/p&gt;
&lt;p&gt;Por exemplo, quando você executa:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;o Maven não executa apenas &lt;code dir=&quot;auto&quot;&gt;package&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ele passa pelas fases anteriores necessárias:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;validate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;test&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Isso torna o processo de build previsível e padronizado.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;e-o-famoso-mvn-clean-install&quot;&gt;E o famoso &lt;code dir=&quot;auto&quot;&gt;mvn clean install&lt;/code&gt;?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Você provavelmente encontrará esse comando em praticamente qualquer projeto Java baseado em Maven:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Mas o que ele faz?&lt;/p&gt;
&lt;p&gt;Primeiro:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Remove os arquivos gerados pelo build anterior.&lt;/p&gt;
&lt;p&gt;Normalmente isso significa remover a pasta:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;target/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Depois:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Executa o ciclo necessário até instalar o artefato no repositório local.&lt;/p&gt;
&lt;p&gt;Simplificando:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;clean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;remove build anterior&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;test&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;É uma maneira bastante comum de garantir que o projeto seja reconstruído do zero.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;o-que-é-a-pasta-target&quot;&gt;O que é a pasta &lt;code dir=&quot;auto&quot;&gt;target&lt;/code&gt;?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Se você executar:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;provavelmente verá uma pasta:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;target/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Ela contém arquivos gerados pelo Maven durante o processo de build.&lt;/p&gt;
&lt;p&gt;Por exemplo:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;target/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── classes/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── test-classes/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── surefire-reports/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└── minha-api-1.0.0.jar&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Essa pasta normalmente &lt;strong&gt;não deve ser versionada no Git&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Por isso, projetos Java geralmente possuem no &lt;code dir=&quot;auto&quot;&gt;.gitignore&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;target/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;maven-e-plugins&quot;&gt;Maven e plugins&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;O Maven não faz tudo sozinho.&lt;/p&gt;
&lt;p&gt;Grande parte de sua funcionalidade é fornecida através de &lt;strong&gt;plugins&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Por exemplo, existem plugins responsáveis por tarefas como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;compilação;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;testes;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;empacotamento;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;documentação;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;análise de dependências;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;execução de aplicações.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Isso torna o Maven extensível.&lt;/p&gt;
&lt;p&gt;Por exemplo, o processo de compilação pode utilizar o Maven Compiler Plugin.&lt;/p&gt;
&lt;p&gt;Já os testes unitários podem ser executados pelo Maven Surefire Plugin.&lt;/p&gt;
&lt;p&gt;Na documentação oficial, as fases do lifecycle possuem bindings que associam determinadas fases a goals de plugins.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;maven-não-é-apenas-um-gerenciador-de-dependências&quot;&gt;Maven não é apenas um gerenciador de dependências&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;É comum alguém dizer:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Maven é o gerenciador de dependências do Java.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Não está totalmente errado, mas é uma definição incompleta.&lt;/p&gt;
&lt;p&gt;O Maven também é responsável por automatizar o processo de build.&lt;/p&gt;
&lt;p&gt;Podemos pensar nele como:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Maven&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;┌──────────┼──────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓          ↓          ↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Dependências    Build      Testes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│          │          │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓          ↓          ↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Bibliotecas  JAR/WAR   JUnit etc.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Ele também possui mecanismos para documentação, publicação de artefatos, projetos multimódulo e gerenciamento de informações do projeto.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;maven-x-compilador-java&quot;&gt;Maven x compilador Java&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Uma dúvida comum é:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Mas o Java já não possui um compilador?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sim.&lt;/p&gt;
&lt;p&gt;O Java possui o &lt;code dir=&quot;auto&quot;&gt;javac&lt;/code&gt;, responsável por compilar código Java.&lt;/p&gt;
&lt;p&gt;Por exemplo:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;javac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Main.java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;O problema é que um projeto real normalmente envolve muito mais coisas.&lt;/p&gt;
&lt;p&gt;Você precisa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;organizar o projeto;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;encontrar dependências;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;configurar o classpath;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;compilar dezenas ou centenas de arquivos;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;executar testes;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;empacotar o resultado;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;controlar versões;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;eventualmente publicar o artefato.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O Maven automatiza esse conjunto de tarefas.&lt;/p&gt;
&lt;p&gt;Em outras palavras:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;javac&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;compila Java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Enquanto:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Maven&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;organiza e automatiza o processo de build&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;O Maven inclusive utiliza plugins para realizar determinadas etapas, como a compilação.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;a-estrutura-padrão-de-um-projeto-maven&quot;&gt;A estrutura padrão de um projeto Maven&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Outra vantagem do Maven é a padronização.&lt;/p&gt;
&lt;p&gt;Um projeto costuma seguir uma estrutura parecida com:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;meu-projeto/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── pom.xml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└── src/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── main/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   ├── java/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   └── resources/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── test/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── java/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── resources/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Código da aplicação:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;src/main/java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Recursos:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;src/main/resources&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Testes:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;src/test/java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Testes e recursos possuem uma estrutura paralela à aplicação.&lt;/p&gt;
&lt;p&gt;Isso significa que, ao abrir um projeto Maven novo, você não precisa descobrir do zero onde cada coisa está.&lt;/p&gt;
&lt;p&gt;O próprio Maven estabelece convenções para essa estrutura.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;maven-e-spring-boot&quot;&gt;Maven e Spring Boot&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Se você está estudando Java para desenvolvimento backend, provavelmente encontrará Maven principalmente através do &lt;strong&gt;Spring Boot&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ao criar uma aplicação Spring Boot, é comum receber um &lt;code dir=&quot;auto&quot;&gt;pom.xml&lt;/code&gt; semelhante a:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;org.springframework.boot&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;spring-boot-starter-parent&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;3.5.6&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;dependency&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;org.springframework.boot&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;spring-boot-starter-web&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;dependency&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;dependency&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;org.springframework.boot&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;spring-boot-starter-test&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;dependency&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Perceba algo interessante.&lt;/p&gt;
&lt;p&gt;Em muitos casos, você nem precisa informar a versão individualmente de cada dependência.&lt;/p&gt;
&lt;p&gt;Isso acontece porque o projeto pode utilizar um &lt;strong&gt;parent POM&lt;/strong&gt; ou mecanismos como &lt;code dir=&quot;auto&quot;&gt;dependencyManagement&lt;/code&gt; para centralizar versões e configurações.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;alguns-comandos-que-você-deve-conhecer&quot;&gt;Alguns comandos que você deve conhecer&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Se você está começando com Maven, estes comandos já cobrem uma boa parte do seu dia a dia:&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;compilar&quot;&gt;Compilar&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;executar-testes&quot;&gt;Executar testes&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;gerar-o-artefato&quot;&gt;Gerar o artefato&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;limpar-o-projeto&quot;&gt;Limpar o projeto&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;limpar-e-gerar-novamente&quot;&gt;Limpar e gerar novamente&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;limpar-testar-empacotar-e-instalar-localmente&quot;&gt;Limpar, testar, empacotar e instalar localmente&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;visualizar-a-árvore-de-dependências&quot;&gt;Visualizar a árvore de dependências&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dependency:tree&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Esse último é especialmente útil quando você começa a enfrentar conflitos de versões entre bibliotecas.&lt;/p&gt;
&lt;p&gt;O próprio Maven disponibiliza o &lt;code dir=&quot;auto&quot;&gt;dependency:tree&lt;/code&gt; para visualizar a árvore de dependências resolvida.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;então-preciso-decorar-todos-esses-comandos&quot;&gt;Então, preciso decorar todos esses comandos?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Não.&lt;/p&gt;
&lt;p&gt;Mais importante do que decorar comandos é entender &lt;strong&gt;o modelo mental do Maven&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Quando você vê:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;package&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;deve conseguir interpretar:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Quero limpar os arquivos gerados anteriormente e executar o processo de build até gerar o pacote.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Quando vê:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mvn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dependency:tree&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;deve pensar:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Quero descobrir quais dependências meu projeto está utilizando e de onde elas vieram.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;E quando abre:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pom.xml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;deve pensar:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Aqui está a definição e boa parte da configuração do meu projeto Maven.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;maven-em-uma-analogia&quot;&gt;Maven em uma analogia&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Imagine que você abriu um restaurante.&lt;/p&gt;
&lt;p&gt;Você poderia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;comprar todos os ingredientes manualmente;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;procurar fornecedores;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;controlar estoque;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;calcular o que precisa ser comprado;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;preparar os ingredientes;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;organizar a cozinha;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;preparar os pratos;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;limpar tudo no final.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ou poderia utilizar um sistema que organiza boa parte desse processo.&lt;/p&gt;
&lt;p&gt;O Maven é parecido com esse sistema para um projeto Java.&lt;/p&gt;
&lt;p&gt;Você declara:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Meu projeto precisa dessas ferramentas e bibliotecas.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;E o Maven cuida de grande parte da infraestrutura necessária para transformar:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;em:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Aplicação pronta para ser executada/distribuída&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;maven-é-obrigatório-para-java&quot;&gt;Maven é obrigatório para Java?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Não.&lt;/p&gt;
&lt;p&gt;Java não depende do Maven para funcionar.&lt;/p&gt;
&lt;p&gt;Existem outras alternativas, como o &lt;strong&gt;Gradle&lt;/strong&gt;, além de ferramentas e abordagens diferentes.&lt;/p&gt;
&lt;p&gt;O Maven, porém, tornou-se uma ferramenta extremamente difundida no ecossistema Java e aparece em uma enorme quantidade de projetos.&lt;/p&gt;
&lt;p&gt;Por isso, para quem está entrando no desenvolvimento Java profissional, entender Maven é muito mais importante do que simplesmente saber executar &lt;code dir=&quot;auto&quot;&gt;mvn clean install&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O objetivo é entender &lt;strong&gt;o que está acontecendo por trás do comando&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;o-que-você-realmente-precisa-aprender&quot;&gt;O que você realmente precisa aprender?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Se você está começando agora, não precisa estudar toda a documentação do Maven.&lt;/p&gt;
&lt;p&gt;Comece entendendo estes conceitos:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;1. O que é o Maven&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;2. O que é o pom.xml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;3. Dependências&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;4. Dependências transitivas&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;5. Repositório local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;6. Maven Central&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;7. Build Lifecycle&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;8. Plugins&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;9. Packaging&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;10. dependencyManagement&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Depois disso, ferramentas como Spring Boot, Docker e pipelines de CI/CD começam a fazer muito mais sentido, porque você entende onde o Maven se encaixa dentro do processo de desenvolvimento.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h1 id=&quot;conclusão&quot;&gt;Conclusão&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;O Maven nasceu de uma necessidade bastante prática: &lt;strong&gt;padronizar e simplificar o processo de construção de projetos Java&lt;/strong&gt;. Desde então, tornou-se uma das ferramentas fundamentais do ecossistema.&lt;/p&gt;
&lt;p&gt;Ele não serve apenas para baixar bibliotecas.&lt;/p&gt;
&lt;p&gt;Ele ajuda a:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;gerenciar dependências;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;compilar código;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;executar testes;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;empacotar aplicações;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;padronizar a estrutura dos projetos;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gerenciar plugins;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;trabalhar com projetos multimódulo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;publicar artefatos.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E talvez a melhor forma de resumir o Maven seja:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Você descreve como seu projeto é organizado e quais são suas necessidades; o Maven automatiza boa parte do trabalho necessário para construir esse projeto.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se você está seguindo uma trilha de estudos de Java, entender Maven é um daqueles assuntos que parecem simples no começo, mas que vão economizar bastante tempo conforme seus projetos ficam maiores.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;referências&quot;&gt;Referências&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://maven.apache.org/what-is-maven&quot;&gt;Apache Maven — Introduction&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://maven.apache.org/pom.html&quot;&gt;Apache Maven — POM Reference&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html&quot;&gt;Apache Maven — Build Lifecycle&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html&quot;&gt;Apache Maven — Dependency Mechanism&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://maven.apache.org/guides/getting-started/&quot;&gt;Apache Maven — Getting Started Guide&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>java</category><category>fundamentos</category></item><item><title>Desmistificando o JVM, JRE e JDK</title><link>https://www.salvaai.com.br/artigos/java/jvm-jre-jdk/</link><guid isPermaLink="true">https://www.salvaai.com.br/artigos/java/jvm-jre-jdk/</guid><description>JVM, JRE e JDK aparecem juntos o tempo todo, mas cada um tem um papel. Veja de forma prática o que cada sigla faz e qual você precisa instalar. 🍳</description><pubDate>Mon, 15 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h2 id=&quot;jvm-jre-e-jdk-afinal-qual-é-a-diferença&quot;&gt;JVM, JRE e JDK: afinal, qual é a diferença?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Se você está começando a estudar Java, provavelmente já encontrou três siglas que aparecem o tempo todo:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JVM, JRE e JDK.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;À primeira vista, elas parecem representar praticamente a mesma coisa. E, para piorar, muitos materiais explicam esses conceitos usando definições bastante técnicas antes mesmo de explicar &lt;strong&gt;como eles se relacionam&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Uma forma simples de entender isso é imaginar que estamos falando de uma cozinha.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;-imagine-que-java-é-uma-cozinha&quot;&gt;🍳 Imagine que Java é uma cozinha&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Vamos começar pelo conceito mais importante.&lt;/p&gt;
&lt;p&gt;Quando escrevemos um programa Java, o código que criamos não é executado diretamente pelo sistema operacional.&lt;/p&gt;
&lt;p&gt;Por exemplo, podemos escrever:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Main&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Hello, World!&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Esse código é transformado pelo compilador em &lt;strong&gt;bytecode&lt;/strong&gt;, normalmente armazenado em um arquivo &lt;code dir=&quot;auto&quot;&gt;.class&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;É aí que entram JVM, JRE e JDK.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;jvm--o-cozinheiro&quot;&gt;JVM — o cozinheiro&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A &lt;strong&gt;JVM (Java Virtual Machine)&lt;/strong&gt; pode ser comparada ao &lt;strong&gt;cozinheiro&lt;/strong&gt; da nossa cozinha.&lt;/p&gt;
&lt;p&gt;É ela quem pega o bytecode Java e efetivamente executa o programa.&lt;/p&gt;
&lt;p&gt;Quando você executa:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;java&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;a JVM entra em ação.&lt;/p&gt;
&lt;p&gt;Ela interpreta ou compila o bytecode para instruções que o computador consegue executar, utilizando técnicas como &lt;strong&gt;JIT (Just-In-Time compilation)&lt;/strong&gt; durante a execução.&lt;/p&gt;
&lt;p&gt;E aqui está uma das grandes ideias por trás do Java:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O mesmo bytecode pode ser executado em diferentes sistemas operacionais, desde que exista uma JVM adequada para aquele sistema.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Por isso, podemos ter:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Main.class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;┌────────┼────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓        ↓        ↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JVM      JVM      JVM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Windows    Linux    macOS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│        │        │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓        ↓        ↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CPU      CPU      CPU&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;O bytecode continua sendo o mesmo.&lt;/p&gt;
&lt;p&gt;O que muda é a implementação da JVM responsável por conversar com o sistema operacional e o hardware.&lt;/p&gt;
&lt;p&gt;É daí que vem a famosa ideia:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Write once, run anywhere.”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Escreva uma vez, execute em qualquer lugar.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;jre--a-cozinha&quot;&gt;JRE — a cozinha&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Agora imagine que o cozinheiro sozinho não consegue fazer muita coisa.&lt;/p&gt;
&lt;p&gt;Ele precisa de uma cozinha, utensílios, ingredientes e toda a estrutura necessária para preparar o prato.&lt;/p&gt;
&lt;p&gt;Essa é uma boa forma de imaginar o &lt;strong&gt;JRE (Java Runtime Environment)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Conceitualmente, o JRE representa o ambiente necessário para &lt;strong&gt;executar aplicações Java&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Podemos simplificar assim:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;JRE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── JVM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└── Bibliotecas necessárias para execução&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Ou, usando nossa analogia:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;JRE = Cozinha + Cozinheiro + Recursos necessários&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Se você simplesmente quer executar uma aplicação Java, você não precisa necessariamente de todas as ferramentas utilizadas pelo desenvolvedor para construir aquela aplicação.&lt;/p&gt;
&lt;p&gt;É a diferença entre:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Quero preparar esta receita.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;e:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Quero criar novas receitas.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No primeiro caso, precisamos da estrutura necessária para cozinhar.&lt;/p&gt;
&lt;p&gt;No segundo, precisamos de ferramentas adicionais.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;jdk--a-cozinha-completa-para-o-desenvolvedor&quot;&gt;JDK — a cozinha completa para o desenvolvedor&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;É aí que entra o &lt;strong&gt;JDK (Java Development Kit)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Se o JRE representa o ambiente necessário para executar aplicações Java, o JDK representa o conjunto de ferramentas necessário para &lt;strong&gt;desenvolver&lt;/strong&gt; essas aplicações.&lt;/p&gt;
&lt;p&gt;Podemos imaginar:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;JDK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── JRE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│   └── JVM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└── Ferramentas de desenvolvimento&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Entre essas ferramentas está o famoso:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;javac&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;O &lt;code dir=&quot;auto&quot;&gt;javac&lt;/code&gt; é o compilador Java.&lt;/p&gt;
&lt;p&gt;Quando fazemos:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;javac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Main.java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;o compilador transforma nosso código-fonte:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Main.java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;em bytecode:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Main.class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Depois, podemos executar esse bytecode utilizando a JVM:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;java&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Portanto, o fluxo simplificado seria:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Desenvolvedor&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Main.java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ javac&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Main.class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ JVM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Programa rodando&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;então-qual-é-a-diferença&quot;&gt;Então qual é a diferença?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Podemos resumir tudo em uma frase:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;JDK desenvolve, JRE fornece o ambiente de execução e JVM executa o bytecode.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ou, usando nossa analogia:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Conceito&lt;/th&gt;
&lt;th&gt;Analogia&lt;/th&gt;
&lt;th&gt;Responsabilidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JVM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;👨‍🍳 Cozinheiro&lt;/td&gt;
&lt;td&gt;Executa o bytecode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JRE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🍳 Cozinha&lt;/td&gt;
&lt;td&gt;Fornece o ambiente necessário para executar Java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🧰 Cozinha completa&lt;/td&gt;
&lt;td&gt;Fornece ferramentas para desenvolver aplicações Java&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A relação pode ser visualizada desta maneira:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;┌─────────────────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│              JDK                │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│                                 │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│   ┌─────────────────────────┐   │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│   │          JRE            │   │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│   │                         │   │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│   │      ┌───────────┐      │   │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│   │      │    JVM    │      │   │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│   │      └───────────┘      │   │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│   │                         │   │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│   └─────────────────────────┘   │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│                                 │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│  + ferramentas de desenvolvimento│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└─────────────────────────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;mas-existe-um-detalhe-importante&quot;&gt;Mas existe um detalhe importante&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Essa representação é muito útil para entender os conceitos, mas existe uma ressalva importante.&lt;/p&gt;
&lt;p&gt;Atualmente, especialmente a partir do &lt;strong&gt;Java 11&lt;/strong&gt;, a ideia de instalar um “JRE separado” não funciona mais da mesma forma que funcionava em versões antigas do Java.&lt;/p&gt;
&lt;p&gt;Distribuições modernas do OpenJDK normalmente são distribuídas como &lt;strong&gt;JDKs&lt;/strong&gt;, e ferramentas como &lt;code dir=&quot;auto&quot;&gt;jlink&lt;/code&gt; podem ser utilizadas para criar runtimes personalizados.&lt;/p&gt;
&lt;p&gt;Por isso, hoje é comum um desenvolvedor simplesmente instalar um JDK, como:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;OpenJDK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Temurin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Oracle JDK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Amazon Corretto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;e utilizar esse ambiente tanto para desenvolver quanto para executar suas aplicações.&lt;/p&gt;
&lt;p&gt;Isso não torna o conceito de JRE inútil.&lt;/p&gt;
&lt;p&gt;Pelo contrário.&lt;/p&gt;
&lt;p&gt;A distinção continua sendo bastante útil para entender &lt;strong&gt;o que uma aplicação Java precisa para ser executada&lt;/strong&gt; e &lt;strong&gt;quais componentes fazem parte do ecossistema Java&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;e-onde-entra-o-java&quot;&gt;E onde entra o Java?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Aqui existe outra confusão bastante comum.&lt;/p&gt;
&lt;p&gt;Quando falamos “Java”, podemos estar falando de coisas diferentes:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── Linguagem Java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── Plataforma Java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── JVM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── Bibliotecas&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└── Ferramentas do JDK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A linguagem é aquilo que escrevemos:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Hello World&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;O compilador transforma esse código em bytecode.&lt;/p&gt;
&lt;p&gt;A JVM executa esse bytecode.&lt;/p&gt;
&lt;p&gt;E o JDK fornece as ferramentas necessárias para construir todo esse processo.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;uma-analogia-completa&quot;&gt;Uma analogia completa&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Voltando para nossa cozinha, podemos pensar em todo o processo assim:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Você é o desenvolvedor.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Você escreve uma receita:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Main.java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;O &lt;strong&gt;JDK&lt;/strong&gt; fornece as ferramentas necessárias para transformar essa receita em algo que possa ser executado.&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;JRE&lt;/strong&gt; representa a estrutura necessária para executar aquilo.&lt;/p&gt;
&lt;p&gt;E a &lt;strong&gt;JVM&lt;/strong&gt; é quem efetivamente prepara a receita.&lt;/p&gt;
&lt;p&gt;No final:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Você&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ escreve&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Java (.java)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ JDK / javac&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Bytecode (.class)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ JVM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Aplicação executando&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Essa separação é uma das características que tornam o ecossistema Java tão interessante.&lt;/p&gt;
&lt;p&gt;O programa não precisa ser compilado diretamente para cada sistema operacional.&lt;/p&gt;
&lt;p&gt;Ele é compilado para &lt;strong&gt;bytecode&lt;/strong&gt;, e a JVM de cada plataforma fica responsável por executar esse bytecode.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;para-guardar&quot;&gt;Para guardar&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Se você está começando no Java, não precisa decorar dezenas de definições.&lt;/p&gt;
&lt;p&gt;Lembre apenas:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;JDK → ferramentas para desenvolver&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JRE → ambiente para executar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JVM → máquina virtual que executa o bytecode&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ou, na nossa cozinha:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;👨‍💻 &lt;strong&gt;JDK é o kit do desenvolvedor.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;🍳 &lt;strong&gt;JRE é o ambiente de execução.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;👨‍🍳 &lt;strong&gt;JVM é quem executa o programa.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Entendendo essa relação, fica muito mais fácil compreender o restante do ecossistema Java.&lt;/p&gt;
</content:encoded><category>java</category><category>fundamentos</category></item><item><title>Bem-vindo ao SalvaAí</title><link>https://www.salvaai.com.br/artigos/bem-vindo/</link><guid isPermaLink="true">https://www.salvaai.com.br/artigos/bem-vindo/</guid><description>O SalvaAí é o meu portal para artigos, manuais e comentários sobre tecnologia e o que mais valer a pena salvar.</description><pubDate>Fri, 25 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;O &lt;strong&gt;SalvaAí&lt;/strong&gt; é o meu portal para artigos, manuais e comentários sobre tecnologia e o que mais valer a pena salvar.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;o-que-você-vai-encontrar&quot;&gt;O que você vai encontrar&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.salvaai.com.br/artigos/&quot;&gt;Artigos&lt;/a&gt;&lt;/strong&gt;: textos sobre Java e tecnologia, comentários sobre notícias e opiniões.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manuais&lt;/strong&gt;: guias sobre temas específicos, organizados para consultar sempre que precisar.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;quem-sou-eu&quot;&gt;Quem sou eu?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Sou João Pedro Ramos Campêlo, de Recife. Sou formado em Análise e Desenvolvimento de Sistemas e gosto do ponto em que tecnologia e finanças se encontram.&lt;/p&gt;
&lt;p&gt;Passei quatro anos na TOTVS, onde trabalhei com clientes de diversos setores. Foi ali que aprendi a traduzir regra de negócio em solução técnica e a conversar com quem não é da área de tecnologia, e foi ali também que comecei a desenvolver, por iniciativa própria, em ADVPL.&lt;/p&gt;
&lt;p&gt;Meu foco de estudo e de construção é backend em Java, com Spring Boot, APIs REST e banco de dados relacional. Fora do trabalho, desenvolvo dois projetos próprios. O Whallet (whallet.com.br) é uma plataforma de gestão financeira para MEIs e pequenas empresas, que já está no ar com usuários acessando. O WhalletRoute é uma plataforma de roteirização e gestão de cargas, ainda em construção.&lt;/p&gt;
&lt;p&gt;Também faço pós-graduação em Arquitetura de Sistemas na FIAP, e boa parte dos temas daqui vem dessa rotina.&lt;/p&gt;
&lt;p&gt;O SalvaAí nasceu disso. Escrevo para fixar o que estudo e deixo registrado o que pode ajudar quem está no mesmo caminho.&lt;/p&gt;
&lt;p&gt;Use a busca (tecla &lt;kbd&gt;/&lt;/kbd&gt;) ou navegue pelos temas para encontrar o que procura.&lt;/p&gt;
</content:encoded><category>SalvaAí</category></item></channel></rss>