JDK · Tooling · Plugin

☕ Java Alapok

Modern Java fejlesztés: JDK 21, Gradle/Maven, Spring Boot, Minecraft plugin workflow.

JDK 21 Gradle Spring Boot

1. Környezet telepítése

  • JDK 21 LTS: Azul Zulu, Temurin vagy Oracle build.
  • IntelliJ IDEA Community + Lombok plugin.
  • SDKMAN! vagy jEnv: több JDK verzió menedzselése.
sdk install java 21.0.1-tem
java -version
mvn -v
gradle -v

2. Projekt bootstrap

mvn archetype:generate \
  -DgroupId=dev.powerfull.demo \
  -DartifactId=java-basics \
  -DarchetypeArtifactId=maven-archetype-quickstart

# vagy Gradle
gradle init --type java-application

A src/main/java és src/test/java mappákat strukturáld domain szerint (pl. feature/task csomagok).

3. Nyelvi minták

public record Player(String name, int score) {}

sealed interface Command permits KickCommand, MotdCommand {}

public final class MotdCommand implements Command {
    public String execute() {
        return "PowerFull Dev's mindig online!";
    }
}

var player = new Player("Lia", 420);
System.out.println(player.name());
  • Használj record-okat DTO-khoz, sealed interfészt zárt hierarchiához.
  • switch expression + pattern matching egyszerűsíti az if blokkokat.

4. Gradle build script

// build.gradle.kts
plugins {
    application
    id("io.spring.dependency-management") version "1.1.5"
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    testImplementation("org.junit.jupiter:junit-jupiter")
}

application {
    mainClass = "dev.powerfull.demo.Application"
}

tasks.test {
    useJUnitPlatform()
}

Verziókat kezeld libs.versions.toml fájlban, így több modul egy helyről frissül.

5. Spring Boot REST API

@RestController
@RequestMapping("/api/status")
public class StatusController {

    @GetMapping
    public Map<String, Object> status() {
        return Map.of(
            "service", "PowerFull Dev's",
            "time", Instant.now().toString()
        );
    }
}
  • Profil alapú config (application-dev.yml, application-prod.yml).
  • DI deklarálása @Service, @ConfigurationProperties annotációkkal.

6. Tesztelés: JUnit + Testcontainers

@SpringBootTest
@Testcontainers
class StatusControllerTest {

    @Container
    static PostgreSQLContainer<?> postgres =
        new PostgreSQLContainer<>("postgres:16-alpine");

    @Autowired
    TestRestTemplate rest;

    @Test
    void healthEndpointWorks() {
        var response = rest.getForEntity("/api/status", String.class);
        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
    }
}

Futtasd ./gradlew test parancsot CI-n is; a Testcontainers automatikusan letölti a szükséges image-et.

7. Aszinkron feladatok

@Service
public class DiscordSyncJob {

    private final ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();

    public CompletableFuture<Void> sync() {
        return CompletableFuture.runAsync(() -> {
            // API hívás + adatbázis update
        }, executor);
    }
}
  • JDK virtuális szálak: Executors.newVirtualThreadPerTaskExecutor().
  • Spring @Scheduled cron job + Lock4j a konkurens futások elkerülésére.

8. Minecraft (Paper) plugin alap

public final class PowerFullPlugin extends JavaPlugin {

    @Override
    public void onEnable() {
        getLogger().info("Plugin betöltve");
        this.getCommand("motd").setExecutor(new MotdCommand());
    }
}

public class MotdCommand implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command,
                             String label, String[] args) {
        sender.sendMessage("PowerFull Dev's szerver üdvözöl!");
        return true;
    }
}

Állíts be plugin.yml-t, és használj paperweight Gradle plugint automatikus reobfJar-hoz.

9. Observability és security

  • Micrometer + Prometheus endpoint: /actuator/prometheus.
  • Spring Security: JWT filter, method-level auth (@PreAuthorize).
  • OWASP: használj beans.xml vagy @Validated annotációkat input sémához.
  • Logback JSON appenderek + OpenTelemetry exporter.

10. DevOps és deployment

# Dockerfile
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY build/libs/app.jar app.jar
ENV JAVA_OPTS="-XX:+UseZGC -XX:MaxRAMPercentage=75.0"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
  1. GitHub Actions: ./gradlew build → Docker build → push → deploy.
  2. Kubernetes: HorizontalPodAutoscaler + liveness/readiness /actuator/health.
  3. Feature flag: Unleash SDK, configMap-ból olvasva.

11. Gyakori hibák

  • ClassNotFoundException: ellenőrizd az árnyékoló plugint vagy a modulútvonalat.
  • java.lang.OutOfMemoryError: állítsd be az -Xms/-Xmx értékeket és monitorozd az allokációkat.
  • ConcurrentModificationException: használj CopyOnWriteArrayList-et vagy stream snapshotot.
  • Paper API verzió mismatch: api-version kulcsot frissítsd a plugin.yml-ben.