A estrutura de diretórios de um projeto Web em Java pode ser categorizada em dois tipos principais: a estrutura de publicação (deployement) e a estrutura de compilação (development). A estrutura de publicação segue um padrão unificado definido pelos contêineres Servlet para carregar a aplicação Web. A estrutura de compilação, por outro lado, varia de acordo com a ferramenta de build utilizada (como Maven ou Gradle) e é uma representação temporária que é transformada na estrutura final de publicação.
Estrutura de Publicação
Esta é a estrutura final que é efetivamente executada pelo servidor de aplicação. Um exemplo típico é mostrado abaixo:
meuapp
├── pagina.html
├── outroDiretorio
│ ├── arquivo.css
│ └── imagem.png
├── WEB-INF
│ ├── web.xml
│ ├── classes
│ │ └── com
│ │ └── minhaempresa
│ │ └── MinhaClasse.class
│ └── lib
│ └── biblioteca-dependencia.jar
└── META-INF
└── MANIFEST.MF
Esta estrutura pode ser dividida em several partes componentes:
- Recursos Estáticos: Incluem arquivos como HTML, CSS, JavaScript, imagens (PNG, JPG) e páginas JSP. Estes ficam acessíveis diretamente. Por exemplo,
pagina.htmlpode ser acessada viahttp://dominio:porta/meuapp/pagina.html. - Arquivo de Configuração da Aplicação (web.xml): Localizado dentro de
WEB-INF, é o descritor de implantação principal. Ele configura parâmetros do contexto, páginas iniciais, filtros, ouvintes e mapeia Servlets. Um exemplo simplificado:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="4.0">
<display-name>Minha Aplicação</display-name>
<context-param>
<param-name>ambiente</param-name>
<param-value>producao</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>ControladorPrincipal</servlet-name>
<servlet-class>com.minhaempresa.ControladorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ControladorPrincipal</servlet-name>
<url-pattern>/acao/*</url-pattern>
</servlet-mapping>
</web-app>
- Código Executável e Dependências: A lógica da aplicação reside em dois locais:
WEB-INF/lib/: contém as bibliotecas JAR de terceiros (dependências).WEB-INF/classes/: contém as classes compiladas do projeto. O carregador de classes busca primeiro emlibe depois emclasses.
- Metadados de Publicação: O arquivo
META-INF/MANIFEST.MFcontém informações de versão geradas durante o processo de build.
Estrutura de Compilação (Desenvolvimento)
A organização dos arquivos fonte durante o desenvolvimento depende da ferramenta. Abaixo estão duas estruturas comuns.
1. Projeto Web Dinâmico (Eclipse/IDE)
IDEs como o Eclipse frequentemente usam esta estrutura padrão:
meuapp-projeto
├── src
│ └── com
│ └── minhaempresa
│ └── MinhaClasse.java
└── WebContent
├── pagina.html
├── WEB-INF
│ ├── web.xml
│ └── lib
└── META-INF
Aqui, src contém o código fonte Java, e WebContent corresponde à raiz da aplicação publicada. O mapeamento entre essas pastas e a estrutura de publicação pode ser configurado nas propriedades do projeto (ex: Deployment Assembly no Eclipse).
2. Estrutura Maven
O Maven segue uma convenção de diretórios bem definida que simplifica a gestão de dependências e o processo de build:
meuapp-maven
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com/minhaempresa/MinhaClasse.java
│ │ ├── resources
│ │ │ └── configuracao.properties
│ │ └── webapp
│ │ ├── pagina.jsp
│ │ └── WEB-INF
│ │ └── web.xml
│ └── test
├── target (gerado pelo Maven)
└── pom.xml
O arquivo pom.xml gerencia todas as dependências e o ciclo de vida do projeto. O mapeamento padrão para publicação é:
src/main/java→WEB-INF/classessrc/main/resources→WEB-INF/classessrc/main/webapp→ raiz da aplicação (/)src/main/webapp/WEB-INF/web.xml→WEB-INF/web.xml- Dependências do Maven →
WEB-INF/lib