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:
- WAR segue uma especificação mais antiga e rígida do Java EE
- JAR com Spring Boot usa uma abordagem mais moderna baseada em convenções
META-INF/resources
é um meio padrão de incluir recursos web em JARs- Spring Boot automatiza muito da configuração que precisaria ser feita manualmente em um WAR