Skip to content

Commit b401c6c

Browse files
author
wlanboy
committed
Update to Java 25
1 parent 8aecb2c commit b401c6c

7 files changed

Lines changed: 133 additions & 29 deletions

File tree

.github/workflows/dockerpublish

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,6 @@ jobs:
99
runs-on: ubuntu-latest
1010
steps:
1111
- uses: actions/checkout@v4
12-
- name: Set up JDK
13-
uses: actions/setup-java@v4
14-
with:
15-
java-version: 21
16-
distribution: 'temurin'
17-
cache: maven
18-
- name: Build with Maven
19-
run: mvn -B package --file pom.xml -DskipTests=true
2012
- name: Publish to Registry
2113
env:
2214
DOCKER_USER: ${{secrets.DOCKER_USERNAME}}

.github/workflows/maven.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
- name: Set up JDK
2020
uses: actions/setup-java@v4
2121
with:
22-
java-version: 21
22+
java-version: 25
2323
distribution: 'temurin'
2424
cache: maven
2525
- name: Build with Maven

.github/workflows/multiarch.yml

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,6 @@ jobs:
88
steps:
99
- uses: actions/checkout@v4
1010

11-
- name: Set up JDK
12-
uses: actions/setup-java@v4
13-
with:
14-
java-version: 21
15-
distribution: 'temurin'
16-
cache: maven
17-
18-
- name: Build with Maven
19-
run: mvn -B package --file pom.xml -DskipTests=true
20-
2111
# --- Multi-Arch Setup ---
2212
- name: Set up QEMU
2313
uses: docker/setup-qemu-action@v3

Dockerfile

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,91 @@
1-
FROM eclipse-temurin:21-jre-noble
2-
VOLUME /tmp
1+
# ============================
2+
# 1. Build Stage (Java 25)
3+
# ============================
4+
FROM registry.access.redhat.com/ubi9/openjdk-25:latest AS build
5+
# Eclipse Temurin bietet aktuelle Java-Versionen inkl. Java 25
36

47
WORKDIR /app
5-
ADD target/javahttpclient-0.0.1-SNAPSHOT.jar /app/javahttpclient.jar
8+
9+
COPY pom.xml .
10+
# → Nur die pom.xml wird kopiert, damit Maven bereits alle Dependencies auflösen kann,
11+
# ohne dass sich der Sourcecode ändert. Das verbessert das Layer-Caching.
12+
13+
RUN --mount=type=cache,target=/root/.m2 mvn -q -DskipTests dependency:go-offline
14+
# → Lädt alle Maven-Dependencies vorab herunter.
15+
# → --mount=type=cache sorgt dafür, dass das lokale Maven-Repository zwischen Builds gecached wird.
16+
17+
COPY src ./src
18+
# → Jetzt erst der Sourcecode, damit Änderungen am Code nicht das Dependency-Layer invalidieren.
19+
20+
RUN --mount=type=cache,target=/root/.m2 mvn -q -DskipTests package
21+
# → Baut das eigentliche JAR.
22+
# → Wieder mit Maven-Cache, um Build-Zeit zu sparen.
23+
24+
RUN cp target/javahttpclient-0.0.1-SNAPSHOT.jar app.jar && \
25+
java -Djarmode=tools -jar app.jar extract --layers --launcher --destination extracted
26+
# → Spring Boot 4.x Layertools: --launcher ist erforderlich um den Loader zu extrahieren
27+
# → Extrahierte Layer:
28+
# - dependencies (BOOT-INF/lib)
29+
# - spring-boot-loader (org/springframework/boot/loader/*)
30+
# - snapshot-dependencies
31+
# - application (BOOT-INF/classes)
32+
# → Vorteil: Docker kann diese Layer getrennt cachen → schnellere Deployments.
33+
34+
# ============================
35+
# 2. Runtime Stage (Java 25)
36+
# ============================
37+
FROM registry.access.redhat.com/ubi9/openjdk-25-runtime:latest
38+
39+
# OCI-konforme Labels
40+
LABEL org.opencontainers.image.title="Java http client" \
41+
org.opencontainers.image.description="Spring based rest service to test http routes in kubernetes." \
42+
org.opencontainers.image.version="0.0.1-SNAPSHOT" \
43+
org.opencontainers.image.vendor="wlanboy" \
44+
org.opencontainers.image.source="https://github.com/wlanboy/JavaHttpClient" \
45+
org.opencontainers.image.licenses="MIT" \
46+
org.opencontainers.image.base.name="eclipse-temurin:25-jre"
47+
48+
WORKDIR /app
49+
50+
USER root
51+
# → Temporär root, um Verzeichnisse anzulegen und Berechtigungen zu setzen.
52+
53+
RUN mkdir -p /app/config /app/data && \
54+
chown -R 185:0 /app && \
55+
chmod -R g+w /app
56+
# → /app/config: für externe Konfigurationen
57+
# → /app/data: für persistente Daten
58+
# → Non-root User für sicheren Betrieb
59+
60+
USER 185
61+
# → Zurück zum nicht-privilegierten User.
62+
63+
COPY --from=build --chown=185:185 /app/extracted/dependencies/ ./
64+
# → Kopiert nur die Dependency-Layer. Ändern sich selten.
65+
66+
COPY --from=build --chown=185:185 /app/extracted/spring-boot-loader/ ./
67+
# → Enthält den Spring Boot Launcher (Main-Class Loader). Ändern sich selten.
68+
69+
COPY --from=build --chown=185:185 /app/extracted/snapshot-dependencies/ ./
70+
# → Snapshot-Dependencies (z. B. lokale libs), ändern sich häufiger.
71+
72+
COPY --from=build --chown=185:185 /app/extracted/application/ ./
73+
# → Der eigentliche Applikationscode (Kompilat). Ändert sich.
74+
75+
COPY --chown=185:185 containerconfig/application.properties /app/config/application.properties
76+
# → Externe Konfiguration ins Config-Verzeichnis für die Referenz für ENV Vars
77+
78+
COPY --chown=185:185 entrypoint.sh /app/entrypoint.sh
79+
# → Custom Entrypoint für Java OPTS.
680

781
EXPOSE 8080
82+
# → Dokumentiert den Port, den die App verwendet (Spring Boot Default).
83+
84+
HEALTHCHECK --interval=30s --timeout=3s \
85+
CMD curl -f http://localhost:8080/actuator/health || exit 1
86+
# → Nutzt den Spring Boot Actuator Health Endpoint.
87+
# → Alternativ: wget oder ein einfacher TCP-Check
888

9-
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/javahttpclient.jar", "--spring.config.location=file:/app/application.properties"]
89+
ENTRYPOINT ["/app/entrypoint.sh"]
90+
# → Startet die App über das Entry-Skript.
91+
# → Vorteil: Skript kann Umgebungsvariablen verarbeiten, ENTRYPOINT nicht.

Dockerfile21

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM eclipse-temurin:21-jre-noble
2+
VOLUME /tmp
3+
4+
WORKDIR /app
5+
ADD target/javahttpclient-0.0.1-SNAPSHOT.jar /app/javahttpclient.jar
6+
7+
EXPOSE 8080
8+
9+
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/javahttpclient.jar", "--spring.config.location=file:/app/application.properties"]

entrypoint.sh

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/bin/sh
2+
# Standard-Shebang für POSIX-kompatible Shells.
3+
# /bin/sh ist bewusst gewählt, weil es in minimalen Container-Images garantiert vorhanden ist.
4+
5+
set -e
6+
# Beendet das Skript sofort, wenn ein Befehl einen Fehler zurückgibt.
7+
8+
# Wir nutzen exec, damit Java die PID 1 übernimmt.
9+
# Dies ist wichtig für das Signal-Handling (z.B. in Kubernetes).
10+
# exec ersetzt den aktuellen Shell-Prozess durch den Java-Prozess.
11+
12+
# JVM-Optionen:
13+
# -Djava.security.egd: Beschleunigt kryptografische Initialisierung
14+
# -XX:MaxRAMPercentage=50: Java nutzt max 50% des Container-RAMs
15+
# -XX:InitialRAMPercentage=30: Startet mit 30% RAM (schnellerer Startup)
16+
# -XX:+UseG1GC: G1 Garbage Collector für niedrige Latenz
17+
# -XX:MaxGCPauseMillis=200: Zielwert für GC-Pause
18+
# -XX:+ExplicitGCInvokesConcurrent: System.gc() läuft parallel
19+
# -XX:+ExitOnOutOfMemoryError: JVM beendet bei OOM (Kubernetes kann neustarten)
20+
21+
exec java \
22+
-Djava.security.egd=file:/dev/./urandom \
23+
-XX:MaxRAMPercentage=50 \
24+
-XX:InitialRAMPercentage=30 \
25+
-XX:+UseG1GC \
26+
-XX:MaxGCPauseMillis=200 \
27+
-XX:+ExplicitGCInvokesConcurrent \
28+
-XX:+ExitOnOutOfMemoryError \
29+
org.springframework.boot.loader.launch.JarLauncher \
30+
--spring.config.location=file:/app/config/application.properties
31+

pom.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
44
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
55
<modelVersion>4.0.0</modelVersion>
6+
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
67
<parent>
7-
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
88
<groupId>org.springframework.boot</groupId>
99
<artifactId>spring-boot-starter-parent</artifactId>
10-
<version>3.5.9</version>
10+
<version>4.0.1</version>
1111
<relativePath /> <!-- lookup parent from repository -->
1212
</parent>
1313

@@ -20,7 +20,7 @@
2020
<properties>
2121
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
2222
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
23-
<java.version>21</java.version>
23+
<java.version>25</java.version>
2424
</properties>
2525
<dependencies>
2626
<dependency>
@@ -46,14 +46,14 @@
4646
<artifactId>micrometer-tracing</artifactId>
4747
</dependency>
4848

49-
<!--https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui-->
49+
<!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui -->
5050
<dependency>
5151
<groupId>org.springdoc</groupId>
5252
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
53-
<version>2.8.14</version>
53+
<version>3.0.1</version>
5454
</dependency>
5555

56-
<!--https://mvnrepository.com/artifact/io.kubernetes/client-java-->
56+
<!-- https://mvnrepository.com/artifact/io.kubernetes/client-java -->
5757
<dependency>
5858
<groupId>io.kubernetes</groupId>
5959
<artifactId>client-java</artifactId>

0 commit comments

Comments
 (0)