Bruno Lellis
💻 Software Developer no iFood
Na parte 1 do guia fizemos uma introdução à linguagem Java, abordando os primeiros passos nesse ambiente.
Siga comigo nesta segunda parte do guia, em que vamos falar sobre práticas que facilitarão o seu dia a dia.
Pegue outra xícara de um bom café e aproveite esta leitura! ☕
👷♀️ Ferramenta de construção
Após os primeiros passos na linguagem, você precisará de uma ferramenta de automação da compilação do projeto. Essas ferramentas ajudam não apenas na construção, como no gerenciamento de dependências (bibliotecas terceiras que você utilizará), execução e validação de testes automatizados, montagem de artefatos (arquivos .jar
), entre outras. Existem plugins bem interessantes que analisam seu código , validando bugs e indicando melhores formas de escrever a mesma lógica. Aqui cabe uma observação importante: aprender com exemplos também é uma forma relevante de absorver conhecimento e que já me ajudou muito.
As ferramentas mais conhecidas incluem Apache Maven , Gradle e Bazel .
Minha recomendação é escolher o Maven. É uma ferramenta mais utilizada (desde projetos simples até complexos) e é relativamente simples de entender. Para instalar, basta sdk install maven
utilizar o SDKMan. A estrutura de um projeto Maven deve seguir algumas premissas, o que também significa que você não precisa ficar pensando em muitos detalhes específicos, o que é bom quando se está começando.
Maven suporta arquétipos, como se modelos fossem prontos para serem usados. Por exemplo:
arquétipo mvn: gerar -B \
-DarchetypeGroupId=org.moditect.ossquickstart \
-DarchetypeArtifactId=oss-quickstart-simple-archetype \
-DarchetypeVersion=1.0.0.Alpha1 \
-DgroupId=com.example.demos \
-DartifactId=fancy- projeto \
-Dversion=1.0.0-SNAPSHOT \
-DmoduleName=com.example.fancy
Uma IDE (abordaremos no próximo tópico) vai facilitar a criação de um projeto, seja com Maven ou Gradle. Ou seja, não se apegue tanto ao comando acima.
Uma funcionalidade menos conhecida e útil é o Maven Daemon , que auxilia financeiramente na velocidade das execuções, mantendo um processo girando em segundo plano e evitando o custo de iniciar repetidamente o ambiente necessário. Para instalar, basta um sdk install mvnd
.
A ferramenta Gradle também é popular e poderosa, tem muita flexibilidade e funcionalidades interessantes como compilação incremental (ou evitação de compilação , que, de forma inteligente, compila apenas as partes que foram modificadas). São funcionalidades interessantes, porém mais avançadas.
📝 Editor/IDE
Muitos desenvolvedores (não apenas no mundo Java) adoram brigar pela melhor ferramenta de construção, a melhor distribuição Linux… e com editor não poderia ser diferente. Ou seja, facilmente muitas opiniões diferentes surgirão neste ponto. Além dos editores, existem também Ambientes de Desenvolvimento Integrados ou IDEs.
Minha sugestão é usar o IntelliJ IDEA . É um IDE relativamente pesado, mas você terá suporte valioso em todas as etapas do desenvolvimento: desde a criação do projeto, com o versionamento (git), com os testes automatizados, com as execuções do Maven/Gradle, com sugestões para simplificar e/ ou melhorar seu código, com refatorações, suporte a depuração, ou seja, vale a pena. Vale citar que existe a versão Community (gratuita) e também a Ultimate (paga). Reserve um tempo para aprender e se acostumar com as teclas de atalho, pois elas te salvarão muito tempo no dia a dia.
Existem outros IDEs igualmente famosos: Eclipse IDE e NetBeans .
Como não poderia deixar de ser, existem opções bastante leves, como é o caso do VSCode com o auxílio de plugins para suportar a linguagem Java . Esta seria a minha segunda opção depois do IntelliJ.
🧱 Bibliotecas
O ecossistema de bibliotecas de terceiros disponíveis é o que torna a linguagem Java tão forte: certamente você encontrará uma opção (biblioteca ou framework) pronta para ser utilizada em todas as tarefas que você imaginar, e geralmente é uma opção de código aberto.
No entanto, tome cuidado! Seja ponderado sobre a escolha de quais bibliotecas você realmente precisa para importar ao seu projeto. Muitas opções também existem na própria linguagem, sem a necessidade de importar uma nova dependência.
Adicionar uma dependência ao seu projeto deve ser sempre uma decisão consciente. Sem um controle disso, você encontrará conflitos entre as versões transitivas (ou seja, dependências das dependências), aumento da complexidade do seu projeto (mantendo tudo atualizado, o que é sempre o recomendado), estará mais sujeito a vulnerabilidades etc. é melhor codificar algo no próprio projeto, ou até mesmo copiar uma parte de uma biblioteca que você precisa — desde que a licença permita.
Algumas bibliotecas famosas que você encontra em muitos projetos Java:
- JUnit para testes unitários;
- slf4j para padronização dos logs;
- Jackson para lidar com JSON;
- Testcontainers para facilitar testes de integração com Docker;
A lista awesome-java é um ponto de partida para conhecer muitas outras opções de bibliotecas famosas.
A grande maioria das bibliotecas está disponível no repositório do Maven Central . Todas as ferramentas de compilação são integradas com esse repositório. O site MVN Repository facilita a busca e detalhes das bibliotecas, com suas versões e suas dependências. Você também poderá chegar ao ponto em que é necessário publicar artigos (bibliotecas) internos em sua organização. Isto é bastante comum e possível com o uso de servidores como Nexus ou Artifactory . Também existem opções na nuvem, como o AWS CodeArtifact .
🐢 Estruturas de Aplicação
Muitos sistemas empresariais são construídos em cima de um framework que fornece suporte para estruturar seu código via injeção de dependência, auxilia perfeitamente no gerenciamento das versões das dependências terceiras (no Maven, BOM ou Bill of Materials ), ajuda nos testes facilitando a criação de mocks das APIs e clientes, entre outros.
Como já deve ser esperado, aqui existem várias opções, em que todas são conhecidas e nenhuma é a melhor em todos os quesitos.
As principais opções são Spring Boot , Quarkus , Micronaut , Helidon , Jakarta EE . Minha recomendação aqui é escolher o Spring Boot , pelo amplo suporte e maturidade. Quarkus e Micronaut são nomes mais novos no mercado e certamente merecem uma chance com você: eles foram criados com o intuito de levar o Java para a nuvem (cloud computing), ou seja, prezam pela simplicidade, evitam ao máximo — ou até proibições — reflexão, tudo isso com o objetivo de suportar o GraalVM (basicamente, código Java compilado nativamente).
O jeito mais simples para começar um projeto utilizando Spring Boot é pelo Spring Initializr . Basta selecionar as opções desejadas, as dependências que você gostaria de utilizar e é isso: o download de um arquivo zip será realizado, imediatamente para ser importado em seu IDE.
🐳 Imagem base do contêiner
Quando você estiver trabalhando em um ambiente corporativo, provavelmente o projeto será publicado no formato de imagem de contêiner, facilitando assim a publicação (deploy) em um ambiente de execução como Docker ou Kubernetes.
Aqui sugiro seguir a mesma versão do Java que recomendo para instalar localmente: seguir com a imagem do Eclipse Temurin , isto é, eclipse-temurin:17
para Java 17. Sempre tenha a preocupação de manter sua imagem atualizada, assim como foi recomendado com suas dependências.
Evite usar a imagem OpenJDK , pois ela está oficialmente depreciada e não é mais recomendada para produção.
🤓 Como se manter atualizado
Esse ecossistema não vai parar de trazer novidades e você precisará se manter atualizado sobre tudo o que gira em torno do Java.
Algumas fontes que utilizo para me manter atualizado e aprender com o que tem acontecido na comunidade:
- Notícias Java
- Dentro.java
- Awesome Java Weekly Newsletter : uma coleção dos principais artigos e novidades da semana;
- Lista de leitura curada por Rodrigo Graciano
- InfoQ Java
- Gunnar Morling no Twitter;
- Siva (@sivalabs) no Twitter: bastante conteúdo, principalmente sobre Spring;
🔭 Próximos Passos
Espero que este guia tenha sido útil para ajudá-lo de alguma forma e que sirva para uma jornada de sucesso no mundo Java. De qualquer forma, este guia é apenas o começo. Dependendo de suas necessidades e requisitos, há uma enorme quantidade de opções para avaliar.
- Construir binários nativos utilizando GraalVM , que permite inicialização rápida (poucos milissegundos) e baixo consumo de memória; muito útil para casos onde sua aplicação precisa inicializar (escalar) rapidamente como em funções AWS Lambda, linhas de comando etc.;
- Estudar formas de integração com outros sistemas, principalmente nesse estágio de microsserviços: ora você precisa criar uma API (REST, síncrono), ora você precisa de algo assíncrono (mensagem). Verifique qual é a recomendação do framework escolhido, pois certamente ele terá algum tipo de suporte para uma API, seja ela REST ou GRPC. O mesmo vale para o caso de mensagens: Kafka, SQS/SNS, JMS etc.;
- Analisar o desempenho e características em tempo de execução de sua aplicação utilizando JDK Flight Recorder e JDK Mission Control ;
- Se aprofundar no mundo de testes automatizados, seja unitário com uso de mocks ( Mockito será um ótimo aliado), seja de integração com menos mocks (o que é ótimo e pode evitar muitos bugs, sendo o testcontainers o maior aliado). Testes automatizados devem ser sempre priorizados durante a implementação da funcionalidade, nada de deixar para depois (famoso terminei, só falta testar ). O tempo economizado e a segurança que os testes trazem — desde que bem escritos — é de extrema importância.
- CI/CD: integração contínua (CI ou integração contínua ) e implantação contínua (CD ou entrega contínua ) são termos que você também precisa entender minimamente como funcionam. E nada melhor do que ter seus testes automatizados integrados nesses pipelines para entregar versões o mais rápido possível.