Documentação atualizada em: 05/02/2026 14:38
Este projeto é uma aplicação Spring Boot configurada para rodar em contêineres Docker, facilitando o desenvolvimento e a implantação.
Nome: Caio Querino
Data da Documentação: 01 de Fevereiro de 2026
Recentemente, corrigimos um erro de 'NoClassDefFoundError' que impedia a execução da aplicação.
- Ajuste no 'pom.xml': Adicionamos o 'spring-boot-starter-parent' e o 'spring-boot-maven-plugin'.
- Dockerfile Otimizado: O Dockerfile agora realiza o build completo.
- Docker instalado
- Docker Compose instalado
- Configure o Ambiente: Edite o arquivo '.env' se necessário.
- Suba os Contêineres: Execute: docker compose up --build -d
- Acesse os Serviços:
- Aplicação: http://localhost:8080
- phpMyAdmin: http://localhost:8081
| Serviço | Usuário | Senha | Porta |
|---|---|---|---|
| Serviço | Usuário | Senha | Porta |
| MySQL | admin | admin@123 | 3306 |
| phpMyAdmin | - | root@123 | 8081 |
| App API | - | - | 8080 |
DB_HOST = localhost
DB_PORT = 3306
DB_NAME = task_db
DB_USER = admin
DB_PASSWORD = admin@123
DB_ROOT_PASSWORD = root@123
PHPMYADMIN_PORT = 8081
APP_PORT = 8080
SPRING_PROFILES_ACTIVE = prod# Configurações do Servidor
server.port = ${APP_PORT}
server.ssl.enabled = false
# Configurações do Banco de Dados
spring.datasource.url = jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}?createDatabaseIfNotExist=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
spring.datasource.username = ${DB_USER}
spring.datasource.password = ${DB_PASSWORD}
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
# Configurações do JPA / Hibernate
spring.jpa.hibernate.ddl-auto = update
spring.jpa.show-sql = true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
spring.jpa.open-in-view = false
# Configurações de JSON
spring.jackson.serialization.fail-on-empty-beans = false
# Desativa SSL/HTTPS forçado
server.http2.enabled = falseversion: '3.8'
services:
db:
image: mysql:8.4.0
container_name: task-mysql
restart: always
environment:
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: task-phpmyadmin
restart: always
environment:
PMA_HOST: db
PMA_PORT: 3306
ports:
- "${PHPMYADMIN_PORT}:80"
depends_on:
- db
app:
build: .
container_name: task-app
restart: always
environment:
DB_HOST: db
DB_PORT: 3306
DB_NAME: ${DB_NAME}
DB_USER: ${DB_USER}
DB_PASSWORD: ${DB_PASSWORD}
ports:
- "${APP_PORT}:8080"
depends_on:
- db
volumes:
mysql_data:# Build stage
FROM maven:3.9.6-eclipse-temurin-17-alpine AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests
# Run stage
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]task-application/
├── src/main/java/com/r2m/praticar/taskapplication/
│ ├── configs/ # Configurações (Segurança, CORS, etc.)
│ ├── controllers/ # Controladores REST
│ ├── dto/ # Data Transfer Objects
│ ├── enums/ # Enumeradores
│ ├── exceptions/ # Exceções customizadas
│ ├── models/ # Entidades JPA
│ ├── repositories/ # Repositórios Spring Data JPA
│ ├── services/ # Lógica de negócio
│ └── TaskApplication.java
├── src/main/resources/
│ └── application.properties
├── .env # Variáveis de ambiente
├── .gitignore
├── docker-compose.yml # Orquestração Docker
├── Dockerfile # Build da aplicação
├── pom.xml # Dependências Maven
└── README.md
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/clients/register |
Registrar novo cliente |
| DELETE | /api/clients/delete/{id} |
Excluir cliente |
| PUT | /api/clients/{id}/activate |
Ativar cliente |
| GET | /api/clients/{id} |
Buscar cliente por ID |
| GET | /api/clients/health |
Health check do serviço |
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/tasks/add |
Adicionar nova tarefa |
| GET | /api/tasks/list |
Listar todas as tarefas |
| PUT | /api/tasks/update/{id} |
Atualizar tarefa |
| DELETE | /api/tasks/delete/{id} |
Excluir tarefa |
| GET | /api/tasks/{id} |
Buscar tarefa por ID |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /test/hello |
Teste básico da API |
| GET | /test/check-db |
Verificar conexão com banco |
# Build e execução com Docker Compose
docker-compose up --build -d
# Parar containers
docker-compose down
# Ver logs da aplicação
docker logs task-app -f
# Ver logs do MySQL
docker logs task-mysql -f
# Acessar shell do container da aplicação
docker exec -it task-app sh
# Acessar MySQL via linha de comando
docker exec -it task-mysql mysql -u admin -padmin@123 task_db
# Rebuild da aplicação apenas
docker-compose build app
# Limpar recursos Docker não utilizados
docker system prune -a| Serviço | URL | Descrição |
|---|---|---|
| Aplicação | http://localhost:8080 | API Spring Boot |
| phpMyAdmin | http://localhost:8081 | Interface web do MySQL |
| Health Check | http://localhost:8080/api/clients/health | Verificar saúde da API |
| Teste API | http://localhost:8080/test/hello | Endpoint de teste |
Causa: Dependências não estão sendo empacotadas corretamente no JAR.
Solução: Verifique se o spring-boot-maven-plugin está configurado no pom.xml para gerar um Fat JAR.
Causa: O container MySQL ainda não está pronto ou as credenciais estão incorretas.
Solução: Aguarde alguns segundos após iniciar os containers. Verifique as credenciais no arquivo .env.
Causa: Outro serviço está usando as portas 8080 ou 8081.
Solução: Altere as portas no arquivo .env ou pare o serviço conflitante.
Causa: Dependências faltando ou configuração incorreta.
Solução: Execute docker-compose build --no-cache para rebuild sem cache.