• Home

    Escolha seu Plano

    Carreiras Alura

    Evolua com profundidade técnica, direção clara e aplicação prática.

    Jornadas guiadas do básico ao avançado com checkpoints práticos, desenhadas para quem busca profundidade e protagonismo técnico.

    Iniciante

    Comece do zero com uma trilha clara e progressiva.

    Fundamentos práticos para dar os primeiros passos com segurança e construir uma base sólida.

    Intermediário

    Continue sua evolução com cursos que conectam fundamentos, ferramentas e prática profissional. Ganhe autonomia, e avance para projetos mais completos.

    Avançado

    Aprofunde temas técnicos e estratégicos para enfrentar desafios mais complexos. Explore boas práticas, arquitetura, performance com visão profissional.

    Cursos

    Ver mais cursos de Back-end
    • Pensamento computacional: fundamentos da computação e lógica de programação
    • Lógica de programação: mergulhe em programação com JavaScript
    • DDD: fundamentos do design orientado a domínio
    • ASP.NET: autenticação e autorização em APIs e aplicações web
    • Microsserviços: migração de monólitos e modularização

    Cursos

    Ver mais cursos de Dados
    • Python para Dados: primeiros passos
    • Excel: domine o editor de planilhas
    • Engenharia de Dados: Orquestração de Pipelines com Apache Airflow
    • Power BI Desktop: construindo meu primeiro dashboard
    • Governança e Arquitetura de Dados

    Cursos

    Ver mais cursos de Inteligência Artificial
    • IA: Explorando o Potencial da Inteligência Artificial Generativa
    • Engenharia de Prompt: Criando Prompts Eficazes para IA Generativa
    • Claude para Análise de Dados: prompts, integrações e automações
    • Agno: criando agentes e sistemas multiagente
    • Engenharia de software na era da IA: segurança de aplicações com agentes, MCPs e código gerado por IA

    Cursos

    Ver mais cursos de Front-end
    • HTML e CSS: ambiente, estrutura e estilo
    • React: realizando testes avançados com Jest e Testing Library
    • React: integrando TypeScript em projetos
    • JavaScript: aprendendo a programar
    • React: aplicando arquiteturas de Micro frontends

    Cursos

    Ver mais cursos de DevOps
    • Sistema Operacional Linux: fundamentos e administração prática
    • Containers e Docker: empacotamento, isolamento e gestão
    • Redes: dos conceitos iniciais à criação de uma intranet
    • Linux: gerenciando diretórios, arquivos, permissões e processos
    • Cibersegurança: Fundamentos e práticas integradas

    Cursos

    Ver mais cursos de UX & Design
    • UX Research: mapeando a experiência da pessoa usuária
    • UX/UI Design: Entregando produtos digitais com IA
    • UI Design: Prototipação e animações interativas
    • Figma: Conhecendo o programa
    • Product Design: métricas e ciclo de vida do produto

    Cursos

    Ver mais cursos de Gestão & Negócios
    • Canva: Criação de landing pages e e-mail marketing
    • Agilidade: como ela pode ajudar a criar um time de alta performance
    • Google Analytics 4: Extrair insights e configurar eventos
    • Management 3.0: gerencie o ambiente, não as pessoas
    • Automação de processos com n8n: Inteligência de dados para Marketing

    Cursos

    Ver mais cursos de Mobile
    • React Native: Estilização e Layouts com Flexbox e StyleSheet
    • Flutter: Graphql e suporte offline
    • Android com Gemini: Trabalhando com textos e imagens na IA
    • Dart: trabalhando com orientação a objetos
    • React Native: Dominando Listas com FlatList e ScrollView

    Carreiras

    Ver mais carreiras
    • Especialista em IA
    • Engenharia de IA
    • Ai native software engineering
    • Arquitetura de Soluções com IA
    • AI Product Design
    • Engenharia de Machine Learning
    • Desenvolvimento Front-End React
    • Engenharia de Dados
    • Cloud Security
    • Social Media Marketing
    • Engenharia de Agentes de IA

    Cursos

    • Engenharia de Prompt: Prompts Eficazes para IA Generativa
    • Claude Code: Criando sua Primeira Aplicação
    • Python: Crie sua Primeira Aplicação
    • Git e GitHub: Compartilhando e Colaborando
    • N8N: Fluxos de Trabalho Avançados

    Cursos

    • Copilot Studio: Solução Multiagentes
    • Padrões de API HTTP e Modelagem de APIs
    • Python para Análise de Dados com SQL
    • Docker: Criando e Gerenciando Containers
    • Design com IA: Otimizando o Processo Criativo

    Cursos

    • Model Context Protocol (MCP)
    • Spec-Driven Development: Dev Assistido por Agentes
    • Arquitetura de Sistemas Distribuídos com Java
    • Governança de Modelos e Reprodutibilidade
    • Pentest: Vulnerabilidades em Aplicações Web

    Escolha seu Plano

    Skills & Go

    O Skills & Go é para Tech Leads, Product Managers, estrategistas e early adopters que transformam ideias em soluções de alto impacto. Em cursos ao vivo e 100% online, você domina a nova era da IA em tempo real.

    Aulas ao vivo

    Saiba mais
    • Agentic Engineering: orquestre múltiplos agentes com confiabilidade
    • Building AI Products: transforme ideias em produtos reais com IA
    • AI Data Strategy: transforme dados em decisões estratégicas com IA

    Escolha seu Plano

    Eventos Alura

    Nossos eventos são pensados para quem quer estar à frente das mudanças em tecnologia, IA e inovação. Em experiências presenciais, você acompanha tendências e se conecta com especialistas que estão moldando o futuro.

    Próximos eventos

    • Imersão Engenharia de Software: Dev na Era da IA
    • IA Conference
    • Alura Signals
  • Talent Lab
  • IA

    Escolha seu Plano

    Conteúdos gratuitos

    Explore conteúdos gratuitos para aprender tecnologia no seu ritmo. Encontre artigos com conteúdos técnicos para aprender na prática, notícias para acompanhar as principais tendências do mercado e o Alura Labs, com análises e reflexões de especialistas sobre tecnologia, IA e carreira.

    Conteúdos gratuitos

    • Artigos
    • Notícias
    • Alura Labs
  • Para Empresas
Ver planos
Links principais
  • Planos e Promoções
  • Links complementares do menu mobile
  • Talent lab
  • Inteligência Artificial
  • Pós Graduações
  • Para Empresas
  • Sobre a Alura
  • Grupo Alun
  • Entrar
    • Home
    • Carreiras
    • Skills & Go
    • Talent Lab
    • Inteligência Artificial
    • Pós Graduações
    • Artigos
    • Sobre a Alura
    • Grupo Alun
    LoginContato
    • LinkedIn
    • Instagram
    • YouTube
    1. Página inicial
    2. Back-end
    3. Simplificando Service Providers com módulos do Java 9+

    Simplificando Service Providers com módulos do Java 9+

    4 min4 minutos de leitura

    4 min4 minutos de leitura

    Publicado: 03/04/2018

    1. Modularizando com o JPMS
    2. Usando a ServiceLoader API em módulos do JPMS
    3. Plugins na sua arquitetura

    Num post anterior, vimos como usar Service Providers na implementação de um plugin de temas da empresa Paradizo para o Cotuba, uma aplicação que gera PDFs e EPUBs a partir de arquivos Markdown. Nesse post, veremos como simplificar a criação de Service Providers com a solução de modularização disponível Java 9 em diante.

    Modularizando com o JPMS

    A partir do Java 9, podemos definir módulos usando o JPMS (Java Platform Module System).

    No arquivo module-info.java do Cotuba, vamos descrever o módulo cotuba:

    
    module cotuba {
    }
    

    Um módulo permite a criação de encapsulamento um nível acima de pacotes ou classes. É possível escolher quais pacotes de um JAR serão expostos para outros módulos.

    Vamos exportar os pacotes:
    - cotuba.plugin, que contém as interfaces LogoAposRenderizarMDParaHTML e AoFinalizarGeracao
    - cotuba.domain, que contém as classes Ebook e Capitulo, entre outras.

    Para isso, devemos usar o exports:

    
    module cotuba {
      exports cotuba.plugin;
      exports cotuba.domain;
    }
    

    Usamos o requires para definir de quais outros módulos dependemos:

    
    module cotuba {
      exports cotuba.plugin;
      exports cotuba.domain;
      requires commons.cli;
      requires org.commonmark;
      requires epublib.core;
      requires html2pdf;
      //outras dependências...
    }
    

    No Cotuba, usamos as bibliotecas Commons CLI, CommonMark, Epublib e iText. Cada um desses tem suas próprias dependências.

    A equipe da Paradizo também modularizou o tema:

    
    module tema.paradizo {
      requires cotuba;
      requires jsoup;
    }
    

    O tema da Paradizo depende da biblioteca JSoup e do módulo do Cotuba.

    No caso de dependermos de um JAR ainda não modularizado, é criado um módulo automaticamente, que expõe todos os pacotes.

    O nome do módulo automático será definido pela configuração Automatic-Module-Name do arquivo META-INF/MANIFEST.MF, o que acontece na biblioteca CommonMark.

    Caso esse arquivo não exista, o nome do próprio JAR será usado. É o caso para as demais bibliotecas.

    Com o JPMS ainda podemos executar a aplicação com um Classpath, por motivos de retrocompatibilidade. Porém, não teríamos as vantagens da modularização.

    Para executarmos de maneira modularizada, devemos usar a opção --module-path. Além disso, precisamos usar a opção --module para indicar qual é o módulo da classe Main:

    
    java --module-path libs --module cotuba/cotuba.Main -f epub
    

    O resultado do comando anterior é o seguinte erro:

    
    Exception in thread "main" java.util.ServiceConfigurationError: 
      cotuba.plugin.LogoAposRenderizarMDParaHTML:
        module cotuba does not declare `uses`
      at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:588)
      ...
      at cotuba/cotuba.plugin.LogoAposRenderizarMDParaHTML.rodaPara(LogoAposRenderizarMDParaHTML.java:13)
    

    Quando usamos módulos do JPMS, precisamos mudar um pouco a maneira de definir os service providers e interfaces.

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Usando a ServiceLoader API em módulos do JPMS

    Em módulos do JPMS, as Service Provider Interfaces (SPI) devem ser definidas com o uses.

    No módulo cotuba, teremos:

    
    module cotuba {
      exports cotuba.plugin;
      exports cotuba.domain;
      requires org.commonmark;
      requires epublib.core;
      requires html2pdf;
      //outras dependências...
      uses cotuba.plugin.LogoAposRenderizarMDParaHTML; //inserido
      uses cotuba.plugin.AoFinalizarGeracao; //inserido
    }
    

    Já no código do tema da Paradizo, indicamos um service provider com provides ... with:

    
    module tema.paradizo {
      requires cotuba;
      requires jsoup;
      provides cotuba.plugin.LogoAposRenderizarMDParaHTML
          with br.com.paradizo.cotuba.tema.TemaParadizo; //inserido
    }
    

    Podemos excluir o arquivo META-INF/services/cotuba.plugin.LogoAposRenderizarMDParaHTML, já que um módulo do Java 9 ignora esse arquivo.

    A definição de SPIs com uses e de service providers com provides ... with nos módulos do JPMS simplifica o uso da Service Loader API.

    Executamos com o mesmo comando anterior:

    
    java --module-path libs --module cotuba/cotuba.Main -f epub
    

    O resultado será:

    
    Executando o tema Paradizo para o capítulo: Aberturas de livros
    Executando o tema Paradizo para o capítulo: Frases
    Arquivo gerado com sucesso: book.epub
    

    O EPUB foi gerado com sucesso e a borda do no título do capítulo foi aplicada.

    Foto do EPUB gerado com o tema da Paradizo

    O código pode ser encontrado em:
    https://github.com/alexandreaquiles/cotuba/tree/java9

    Plugins na sua arquitetura

    Há um estilo arquitetural em que o domain model é o núcleo da aplicação. Uma interface de linha comando seria um plugin. Uma aplicação Web seria outro plugin. A persistência em um banco de dados relacional, outro plugin. Persistência em um datastore NoSQL, mais um plugin. Integrações com outros sistemas, mais plugins.

    Usando interfaces, invertemos as dependências para que todos dependam do domain model, que não depende de ninguém. As dependências sempre apontam na direção das regras de negócio, nunca ao contrário. Cada "mecanismo de entrega" seria um plugin diferente.

    Teríamos uma melhor manutenibilidade, extensibilidade e testabilidade, mas ao custo de maior complexidade. Esse estilo arquitetural é detalhado na arquitetura hexagonal e na clean architecture.

    No caso do Cotuba, o núcleo da aplicação poderia ficar no módulo cotuba. Extrairíamos a interface de linha de comando para o módulo cotuba.cli. A geração de PDFs para o módulo cotuba.pdf e de EPUBs para o módulo cotuba.epub. Definiríamos interfaces, criando contratos e invertendo as dependências entre esses módulos, sempre apontando na direção do módulo cotuba.

    Módulos cotuba.cli, cotuba.pdf e cotuba.epub dependem do módulo cotuba

    O desenvolvimento de cada módulo poderia ser feito por diferentes times. As interfaces dos plugins seriam muito importantes para a comunicação entre esses times.

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Avalie este artigo

    • Foto de alexandre.aquiles

      Autor(a)

      alexandre.aquiles

    Explore por tópico

    • Back-end
    • Dados
    • DevOps
    • Front-end
    • Gestão & Negócios
    • Institucionais
    • Inteligência Artificial
    • Mobile
    • UX & Design

    Leia também

    • Alura
      29/07/2014

      Evite NullPointerException com java.util.Optional no Java

      Ler mais
    • Alura
      03/10/2016

      O que é o operador ternário?

      Ler mais
    • 11/05/2015

      Simplifique consultas no Hibernate com Query By Example

      Ler mais
    Ver mais conteúdos

    Inscreva-se em nossa Newsletter

    Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.

    Institucional

    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status
    Institucional
    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status

    A Alura

    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes
    A Alura
    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes

    Conteúdos

    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Conteúdos
    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Alura