Diferença do empacotamento JAR e WAR na configuração do JSF com Spring Boot


Diferença entre WAR e JAR

WAR (Web Application Archive)

  • É um formato tradicional para aplicações web Java

  • Segue a especificação Java EE/Jakarta EE para estrutura de aplicações web

  • Precisa ser implantado em um servidor de aplicação (como Tomcat, JBoss, etc.)

  • Tem uma estrutura específica definida pela especificação Java EE:

    webapp/
    ├── WEB-INF/
    │   ├── web.xml
    │   ├── classes/
    │   ├── lib/
    │   └── faces-config.xml
    ├── resources/
    ├── pages/
    └── index.xhtml
    

JAR (Java Archive)

  • Formato mais simples e auto-contido
  • Usado tradicionalmente para bibliotecas Java
  • No contexto do Spring Boot, pode conter uma aplicação web completa
  • Estrutura mais flexível, seguindo o padrão do Maven:
    src/main/
    ├── java/
    ├── resources/
    │   ├── META-INF/
    │   │   └── resources/
    │   ├── static/
    │   └── templates/
    

Por que essa diferença?

No caso do WAR:

  • A pasta webapp é parte da especificação Java EE
  • O servidor de aplicação sabe exatamente onde procurar os recursos
  • O web.xml define a configuração da aplicação web
  • A estrutura é padronizada para qualquer servidor Java EE

No caso do JAR com Spring Boot:

  • Spring Boot usa um servidor embarcado (geralmente Tomcat)
  • O Spring Boot segue a convenção de “recursos no classpath”
  • META-INF/resources é um diretório especial reconhecido pela especificação do Servlet 3.0
  • Permite que recursos sejam servidos diretamente do classpath

Estrutura do JAR

src/
├── main/
│   ├── java/                    # Código fonte Java
│   │   └── com/empresa/
│   │       ├── config/          # Configurações do Spring/JSF
│   │       ├── controller/      # Managed Beans do JSF
│   │       ├── model/           # Classes de domínio
│   │       └── service/         # Lógica de negócio
│   │
│   └── resources/              # Recursos da aplicação
│       ├── META-INF/
│       │   └── resources/      # Arquivos web (xhtml, css, js)
│       │       ├── pages/      # Páginas JSF
│       │       └── templates/  # Templates Facelets
│       │
│       ├── static/            # Recursos estáticos (imagens, css, js)
│       └── application.yml    # Configurações do Spring Boot
  • META-INF/resources/:

    • É um diretório especial reconhecido pela especificação Servlet 3.0
    • Permite que recursos sejam acessados diretamente através da URL
    • Os arquivos aqui são tratados como recursos web públicos
    • O Spring Boot automaticamente mapeia este diretório para a raiz da aplicação web
  • static/:

    • Usado para conteúdo estático que não precisa ser processado
    • Arquivos CSS, JavaScript, imagens
    • Acessível diretamente pela URL sem passar pelo FacesServlet
  • templates/:

    • Contém templates Facelets
    • Não são acessíveis diretamente pela URL
    • Usados para composição de páginas

Como o Spring Boot gerencia isso

@Configuration
public class JSFConfig {
    // O Spring Boot automaticamente configura o FacesServlet
    // e mapeia os recursos em META-INF/resources
    
    @Bean
    public ServletRegistrationBean<FacesServlet> facesServlet() {
        ServletRegistrationBean<FacesServlet> servlet = 
            new ServletRegistrationBean<>(new FacesServlet(), "*.xhtml");
        servlet.setLoadOnStartup(1);
        return servlet;
    }
}

Benefícios do formato JAR com Spring Boot

  • Aplicação auto-contida
  • Não precisa de servidor de aplicação externo
  • Mais fácil de distribuir e executar
  • Melhor para arquiteturas de microserviços
  • Configuração mais simples
  • Deploy mais rápido

Fluxo de requisição:

Request -> Embedded Tomcat -> Spring Boot -> FacesServlet -> JSF Pages
                                        |
                                        └-> Static Resources

Em resumo, a diferença na estrutura de diretórios entre JAR e WAR existe porque:

  1. WAR segue uma especificação mais antiga e rígida do Java EE
  2. JAR com Spring Boot usa uma abordagem mais moderna baseada em convenções
  3. META-INF/resources é um meio padrão de incluir recursos web em JARs
  4. Spring Boot automatiza muito da configuração que precisaria ser feita manualmente em um WAR

Referências