Initial commit

This commit is contained in:
Gabriel Franco 2026-08-05 10:02:20 -03:00 committed by GitHub
commit ed4b6dd072
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 919 additions and 0 deletions

7
.devcontainer/Dockerfile Normal file
View file

@ -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/*

View file

@ -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"
}

48
.editorconfig Normal file
View file

@ -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

115
.gitignore vendored Normal file
View file

@ -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

20
README.md Normal file
View file

@ -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

162
create-project.sh Normal file
View file

@ -0,0 +1,162 @@
#!/usr/bin/env bash
set -euo pipefail
if [ "$#" -lt 2 ]; then
echo "Uso: $0 <groupId> <artifactId>"
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" <<EOF
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>$GROUP_ID</groupId>
<artifactId>$ARTIFACT_ID</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.release>25</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- JUnit Jupiter para testes unitários -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Compilação com Java 25 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<release>25</release>
</configuration>
</plugin>
<!-- Execução dos testes JUnit -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<useModulePath>false</useModulePath>
</configuration>
</plugin>
<!-- Execução da classe principal -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
</project>
EOF
cat > "$SRC_MAIN_JAVA/App.java" <<EOF
package $GROUP_ID;
public class App {
public static void main(String[] args) {
System.out.println(
"Hello, world! Projeto $ARTIFACT_ID criado com sucesso."
);
}
}
EOF
cat > "$SRC_TEST_JAVA/AppTest.java" <<EOF
package $GROUP_ID;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
class AppTest {
@Test
void testApp() {
assertTrue(true, "Teste básico de funcionamento.");
}
}
EOF
cat > "$BASE_DIR/README.md" <<EOF
# $ARTIFACT_ID
Projeto Maven criado automaticamente com Java 25 e JUnit 5.
## Requisitos
- Java 25
- Maven
## Como compilar
\`\`\`bash
mvn compile
\`\`\`
## Como executar
\`\`\`bash
mvn exec:java -Dexec.mainClass="$GROUP_ID.App"
\`\`\`
## Como executar os testes
\`\`\`bash
mvn test
\`\`\`
## Como gerar o pacote
\`\`\`bash
mvn package
\`\`\`
EOF
echo
echo "Projeto '$ARTIFACT_ID' criado com sucesso."
echo "Java: 25"
echo
echo "Para testar:"
echo " cd '$ARTIFACT_ID'"
echo " mvn test"
echo " mvn exec:java -Dexec.mainClass=\"$GROUP_ID.App\""

202
create-spring-project.sh Normal file
View file

@ -0,0 +1,202 @@
#!/usr/bin/env bash
set -euo pipefail
if [ "$#" -lt 2 ]; then
echo "Uso: $0 <groupId> <artifactId>"
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" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>$SPRING_BOOT_VERSION</version>
<relativePath/>
</parent>
<groupId>$GROUP_ID</groupId>
<artifactId>$ARTIFACT_ID</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>$JAVA_VERSION</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
EOF
cat > "$SRC_MAIN_JAVA/App.java" <<EOF
package $GROUP_ID;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
EOF
cat > "$SRC_MAIN_JAVA/HelloController.java" <<EOF
package $GROUP_ID;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/")
public String hello() {
return "Hello World!";
}
}
EOF
cat > "$SRC_TEST_JAVA/AppTest.java" <<EOF
package $GROUP_ID;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import org.junit.jupiter.api.Test;
class AppTest {
@Test
void testApp() {
assertNotNull(new App());
}
}
EOF
cat > "$SRC_MAIN_RESOURCES/application.properties" <<EOF
spring.application.name=$ARTIFACT_ID
server.port=8080
EOF
cat > "$BASE_DIR/README.md" <<EOF
# $ARTIFACT_ID
Projeto Spring Boot criado automaticamente.
## Requisitos
- Java $JAVA_VERSION
- Maven
## Executar
\`\`\`bash
mvn spring-boot:run
\`\`\`
Acesse:
http://localhost:8080
## Testes
\`\`\`bash
mvn test
\`\`\`
## Empacotar
\`\`\`bash
mvn clean package
\`\`\`
## Executar o JAR
\`\`\`bash
java -jar target/$ARTIFACT_ID-1.0-SNAPSHOT.jar
\`\`\`
EOF
echo
echo "Projeto criado com sucesso."
echo
echo "Para executar:"
echo " cd $ARTIFACT_ID"
echo " mvn spring-boot:run"
echo
echo "Abra:"
echo " http://localhost:8080"

314
create-vaadin-project.sh Normal file
View file

@ -0,0 +1,314 @@
#!/usr/bin/env bash
set -euo pipefail
if [ "$#" -lt 2 ]; then
echo "Uso: $0 <groupId> <artifactId>"
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" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>$SPRING_BOOT_VERSION</version>
<relativePath/>
</parent>
<groupId>$GROUP_ID</groupId>
<artifactId>$ARTIFACT_ID</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>$ARTIFACT_ID</name>
<description>Projeto Vaadin com Spring Boot</description>
<properties>
<java.version>$JAVA_VERSION</java.version>
<vaadin.version>$VAADIN_VERSION</vaadin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-bom</artifactId>
<version>\${vaadin.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-dev</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-maven-plugin</artifactId>
<version>\${vaadin.version}</version>
<executions>
<execution>
<goals>
<goal>prepare-frontend</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>production</id>
<dependencies>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-core</artifactId>
<exclusions>
<exclusion>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-dev</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-maven-plugin</artifactId>
<version>\${vaadin.version}</version>
<executions>
<execution>
<goals>
<goal>build-frontend</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
EOF
cat > "$SRC_MAIN_JAVA/App.java" <<EOF
package $GROUP_ID;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
EOF
cat > "$SRC_MAIN_JAVA/MainView.java" <<EOF
package $GROUP_ID;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.theme.lumo.LumoUtility;
@Route("")
public class MainView extends VerticalLayout {
public MainView() {
setSizeFull();
setAlignItems(Alignment.CENTER);
setJustifyContentMode(JustifyContentMode.CENTER);
H1 titulo = new H1("$ARTIFACT_ID");
titulo.addClassName(LumoUtility.Margin.NONE);
Button botao = new Button(
"Clique aqui",
evento -> Notification.show(
"Olá, mundo!",
3000,
Notification.Position.TOP_CENTER
)
);
add(titulo, botao);
}
}
EOF
cat > "$SRC_TEST_JAVA/AppTest.java" <<EOF
package $GROUP_ID;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import org.junit.jupiter.api.Test;
class AppTest {
@Test
void aplicacaoPodeSerInstanciada() {
App app = new App();
assertNotNull(app);
}
}
EOF
cat > "$SRC_MAIN_RESOURCES/application.properties" <<EOF
spring.application.name=$ARTIFACT_ID
server.port=8080
vaadin.launch-browser=true
EOF
cat > "$BASE_DIR/README.md" <<EOF
# $ARTIFACT_ID
Projeto criado automaticamente com:
- Java $JAVA_VERSION
- Spring Boot $SPRING_BOOT_VERSION
- Vaadin $VAADIN_VERSION
- Maven
## Executar em modo de desenvolvimento
\`\`\`bash
mvn spring-boot:run
\`\`\`
Depois acesse:
\`\`\`text
http://localhost:8080
\`\`\`
## Executar os testes
\`\`\`bash
mvn test
\`\`\`
## Gerar pacote de desenvolvimento
\`\`\`bash
mvn clean package
\`\`\`
## Gerar pacote de produção
\`\`\`bash
mvn clean package -Pproduction
\`\`\`
O arquivo gerado estará em:
\`\`\`text
target/$ARTIFACT_ID-1.0-SNAPSHOT.jar
\`\`\`
## Executar o JAR
\`\`\`bash
java -jar target/$ARTIFACT_ID-1.0-SNAPSHOT.jar
\`\`\`
EOF
echo
echo "Projeto '$ARTIFACT_ID' criado com sucesso."
echo
echo "Para executar:"
echo " cd '$ARTIFACT_ID'"
echo " mvn spring-boot:run"
echo
echo "Acesse: http://localhost:8080"