From ed4b6dd072f4dce393454fe34c13d47dbcd719f1 Mon Sep 17 00:00:00 2001 From: Gabriel Franco Date: Wed, 5 Aug 2026 10:02:20 -0300 Subject: [PATCH] Initial commit --- .devcontainer/Dockerfile | 7 + .devcontainer/devcontainer.json | 51 ++++++ .editorconfig | 48 +++++ .gitignore | 115 ++++++++++++ README.md | 20 ++ create-project.sh | 162 ++++++++++++++++ create-spring-project.sh | 202 ++++++++++++++++++++ create-vaadin-project.sh | 314 ++++++++++++++++++++++++++++++++ 8 files changed, 919 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 README.md create mode 100644 create-project.sh create mode 100644 create-spring-project.sh create mode 100644 create-vaadin-project.sh diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..2c1a4b5 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,7 @@ +FROM mcr.microsoft.com/devcontainers/java:25-bookworm + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + graphviz \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..459971e --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,51 @@ +{ + "name": "Java 25 Classroom", + "build": { + "dockerfile": "Dockerfile" + }, + "features": { + "ghcr.io/devcontainers/features/common-utils:2": {}, + "ghcr.io/devcontainers/features/java:1": { + "version": "25", + "installMaven": true, + "installGradle": false + }, + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/sshd:1": { + "version": "latest" + } + }, + "customizations": { + "vscode": { + "extensions": [ + "vscjava.vscode-java-pack", + "vmware.vscode-boot-dev-pack", + "redhat.vscode-xml", + "redhat.vscode-yaml", + "ms-azuretools.vscode-containers", + "jebbs.plantuml", + "GitHub.copilot", + "GitHub.copilot-chat", + "EditorConfig.EditorConfig" + ], + "settings": { + "java.configuration.runtimes": [ + { + "name": "JavaSE-25", + "path": "/usr/local/sdkman/candidates/java/current", + "default": true + } + ], + "java.compile.nullAnalysis.mode": "automatic", + "java.configuration.updateBuildConfiguration": "automatic", + "editor.formatOnSave": true, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true + } + } + }, + "forwardPorts": [ + 8080 + ], + "postCreateCommand": "java -version && mvn -version && docker --version" +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c713b5a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,48 @@ +# EditorConfig is awesome: https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 + +[*.java] +indent_style = space +indent_size = 4 + +[*.xml] +indent_style = space +indent_size = 2 + +[*.yml] +indent_style = space +indent_size = 2 + +[*.yaml] +indent_style = space +indent_size = 2 + +[*.json] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[Dockerfile] +indent_style = space +indent_size = 4 + +[*.sh] +indent_style = space +indent_size = 2 + +[*.bat] +end_of_line = crlf + +[*.ps1] +end_of_line = crlf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..56e14aa --- /dev/null +++ b/.gitignore @@ -0,0 +1,115 @@ +# Java / JVM +*.class +*.jar +*.war +*.ear +*.nar +*.log +hs_err_pid* +replay_pid* +target/ +bin/ +out/ +build/ +.gradle/ +.gradle-cache/ + +# Maven +.mvn/wrapper/maven-wrapper.jar +dependency-reduced-pom.xml +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties + +# IDEs +.idea/ +*.iml +*.ipr +*.iws +.project +.classpath +.settings/ + +# VS Code +.vscode/* +!.vscode/extensions.json +!.vscode/settings.json +!.vscode/launch.json +!.vscode/tasks.json + +# Dev Containers +# Mantém configuração versionada +!.devcontainer/ +!.devcontainer/devcontainer.json +!.devcontainer/Dockerfile + +# Vaadin +node_modules/ +frontend/generated/ +src/main/frontend/generated/ +src/main/bundles/ +src/main/resources/META-INF/VAADIN/ +vite.generated.ts +types.d.ts +package-lock.json +pnpm-lock.yaml +webpack.generated.js +webpack.config.js +webpack.generated.config.js + +# Node / JavaScript / TypeScript +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-store/ +.npm/ +.yarn/ +dist/ +coverage/ +.cache/ +.parcel-cache/ +.next/ +.nuxt/ + +# Python +__pycache__/ +*.py[cod] +*$py.class +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +.venv/ +venv/ +env/ +ENV/ +.ipynb_checkpoints/ + +# Docker +.docker/ +docker-compose.override.yml +*.env +.env +.env.* +!.env.example + +# OS +.DS_Store +Thumbs.db +desktop.ini + +# Logs / temporários +logs/ +tmp/ +temp/ +*.tmp +*.bak +*.swp +*.swo + +# Arquivos locais do projeto +application-local.yml +application-local.yaml +application-dev.yml +application-dev.yaml diff --git a/README.md b/README.md new file mode 100644 index 0000000..c5c1e22 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# Desenvolvimento Java +- Repositório base para uso em disciplinas de desenvolvimento de software +- Configurado para desenvolvimento em Java +- Pensado para ser usado como "Monorepo" para uma série de projetos de aula +- As instruções a seguir referem-se ao uso deste repositório em conjunto com o CodeSpaces + +## Criação de Projetos Java Básicos +O script "create-project.sh" cria um projeto Maven/Java básico para ser usado em disciplinas de algoritmos e programação +- Para que o uso deste script seja possível é necessário que o mesmo tenha permissão de execução. Antes de usar o script pela primeira vez use o comando: `chmod +x create-project.sh` +- Para criar um projeto usando o script use o comando: `./create-project.sh com.exemplo meu-projeto` +- Para compilar e executar o projeto use as opções do VSCode + +## Criação de projetos usando Vaadin +O script "create-vaadin-project.sh" cria um projeto Maven/Spring-Boot/Vaadin para ser usado em disciplinas de programação +- Para que o uso deste script seja possível é necessário que o mesmo tenha permissão de execução. Antes de usar o script pela primeira vez use o comando: `chmod +x create-vaadin-project.sh` +- Para criar um projeto usando o script use o comando: `./create-vaadin-project.sh com.exemplo meu-projeto` +- Para compilar e executar o projeto use o comando: `mvn spring-boot:run` + +## Criação de projetos SpringBoot +- Use o plugin de criação de projetos Spring-Boot do VSCode diff --git a/create-project.sh b/create-project.sh new file mode 100644 index 0000000..d016f13 --- /dev/null +++ b/create-project.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [ "$#" -lt 2 ]; then + echo "Uso: $0 " + echo "Exemplo: $0 com.exemplo meu-projeto" + exit 1 +fi + +GROUP_ID="$1" +ARTIFACT_ID="$2" + +echo "Criando projeto Maven '$ARTIFACT_ID' com groupId '$GROUP_ID' e Java 25..." + +BASE_DIR="$ARTIFACT_ID" +PACKAGE_DIR="$(echo "$GROUP_ID" | tr '.' '/')" + +SRC_MAIN_JAVA="$BASE_DIR/src/main/java/$PACKAGE_DIR" +SRC_TEST_JAVA="$BASE_DIR/src/test/java/$PACKAGE_DIR" + +if [ -e "$BASE_DIR" ]; then + echo "Erro: o diretório '$BASE_DIR' já existe." + exit 1 +fi + +mkdir -p "$SRC_MAIN_JAVA" +mkdir -p "$SRC_TEST_JAVA" + +cat > "$BASE_DIR/pom.xml" < + + 4.0.0 + + $GROUP_ID + $ARTIFACT_ID + 1.0-SNAPSHOT + + + 25 + UTF-8 + + + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 25 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.1.2 + + false + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + + + +EOF + +cat > "$SRC_MAIN_JAVA/App.java" < "$SRC_TEST_JAVA/AppTest.java" < "$BASE_DIR/README.md" < " + echo "Exemplo: $0 com.exemplo api-pessoas" + exit 1 +fi + +GROUP_ID="$1" +ARTIFACT_ID="$2" + +JAVA_VERSION="25" +SPRING_BOOT_VERSION="4.1.0" + +PACKAGE_DIR="${GROUP_ID//./\/}" +BASE_DIR="$ARTIFACT_ID" + +SRC_MAIN_JAVA="$BASE_DIR/src/main/java/$PACKAGE_DIR" +SRC_TEST_JAVA="$BASE_DIR/src/test/java/$PACKAGE_DIR" +SRC_MAIN_RESOURCES="$BASE_DIR/src/main/resources" + +echo "Criando projeto Spring Boot..." + +if [ -e "$BASE_DIR" ]; then + echo "Erro: diretório '$BASE_DIR' já existe." + exit 1 +fi + +mkdir -p "$SRC_MAIN_JAVA" +mkdir -p "$SRC_TEST_JAVA" +mkdir -p "$SRC_MAIN_RESOURCES" + +cat > "$BASE_DIR/pom.xml" < + + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + $SPRING_BOOT_VERSION + + + + $GROUP_ID + $ARTIFACT_ID + 1.0-SNAPSHOT + + + $JAVA_VERSION + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + +EOF + +cat > "$SRC_MAIN_JAVA/App.java" < "$SRC_MAIN_JAVA/HelloController.java" < "$SRC_TEST_JAVA/AppTest.java" < "$SRC_MAIN_RESOURCES/application.properties" < "$BASE_DIR/README.md" < " + echo "Exemplo: $0 com.exemplo vaadin-app" + exit 1 +fi + +GROUP_ID="$1" +ARTIFACT_ID="$2" + +JAVA_VERSION="25" +SPRING_BOOT_VERSION="4.1.0" +VAADIN_VERSION="25.2.1" + +PACKAGE_DIR="${GROUP_ID//./\/}" +BASE_DIR="$ARTIFACT_ID" + +SRC_MAIN_JAVA="$BASE_DIR/src/main/java/$PACKAGE_DIR" +SRC_TEST_JAVA="$BASE_DIR/src/test/java/$PACKAGE_DIR" +SRC_MAIN_RESOURCES="$BASE_DIR/src/main/resources" + +echo "Criando projeto Vaadin + Spring Boot '$ARTIFACT_ID'..." +echo "Group ID: $GROUP_ID" +echo "Java: $JAVA_VERSION" +echo "Spring Boot: $SPRING_BOOT_VERSION" +echo "Vaadin: $VAADIN_VERSION" + +if [ -e "$BASE_DIR" ]; then + echo "Erro: o diretório '$BASE_DIR' já existe." + exit 1 +fi + +mkdir -p "$SRC_MAIN_JAVA" +mkdir -p "$SRC_TEST_JAVA" +mkdir -p "$SRC_MAIN_RESOURCES" + +cat > "$BASE_DIR/pom.xml" < + + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + $SPRING_BOOT_VERSION + + + + $GROUP_ID + $ARTIFACT_ID + 1.0-SNAPSHOT + jar + + $ARTIFACT_ID + Projeto Vaadin com Spring Boot + + + $JAVA_VERSION + $VAADIN_VERSION + UTF-8 + + + + + + com.vaadin + vaadin-bom + \${vaadin.version} + pom + import + + + + + + + + com.vaadin + vaadin-spring-boot-starter + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.vaadin + vaadin-dev + true + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + com.vaadin + vaadin-maven-plugin + \${vaadin.version} + + + + prepare-frontend + + + + + + + + + + + + production + + + + com.vaadin + vaadin-core + + + com.vaadin + vaadin-dev + + + + + + + + + com.vaadin + vaadin-maven-plugin + \${vaadin.version} + + + + build-frontend + + + + + + + + + + + + +EOF + +cat > "$SRC_MAIN_JAVA/App.java" < "$SRC_MAIN_JAVA/MainView.java" < Notification.show( + "Olá, mundo!", + 3000, + Notification.Position.TOP_CENTER + ) + ); + + add(titulo, botao); + } +} +EOF + +cat > "$SRC_TEST_JAVA/AppTest.java" < "$SRC_MAIN_RESOURCES/application.properties" < "$BASE_DIR/README.md" <