@@ -10,8 +10,11 @@ RUN --mount=type=cache,target=/root/.m2 mvn -q -DskipTests dependency:go-offline
1010COPY src ./src
1111RUN --mount=type=cache,target=/root/.m2 mvn -q -DskipTests compile spring-boot:process-aot package
1212
13- # JAR extrahieren für Layering
14- RUN cp target/kubeevent-0.0.1-SNAPSHOT.jar app.jar && \
13+ # JAR extrahieren für Layering (Layer gemäß src/main/resources/layers.xml):
14+ # - dependencies, observability-dependencies, spring-boot-loader, snapshot-dependencies, application
15+ # Versionsneutrale Selektion: schließt das Original-JAR (nicht-umgepacktes) aus
16+ RUN JAR=$(ls target/*.jar | grep -v original) && \
17+ cp "$JAR" app.jar && \
1518 java -Djarmode=tools -jar app.jar extract --layers --launcher --destination extracted
1619
1720# ============================
@@ -58,28 +61,27 @@ RUN $JAVA_HOME/bin/jlink \
5861 --no-man-pages \
5962 --no-header-files \
6063 --compress zip-9 \
61- --add-options "-XX:+UseZGC -XX:+ExitOnOutOfMemoryError -Dfile.encoding=UTF-8" \
62- --output /custom-jre
63-
64- # Erzeuge die Klassenliste für AppCDS
65- RUN /custom-jre/bin/java -Djarmode=tools -jar app.jar extract --layers --destination cds-extraction
64+ --output /opt/jre
6665
6766# Erzeugt das Basis-Archiv für das Custom JRE
68- RUN /custom-jre/bin/java -Xshare:dump
67+ # WICHTIG: -XX:+UseZGC muss hier angegeben werden! ZGC nutzt Colored Pointers (andere Heap-Struktur als G1GC).
68+ # Das CDS-Archiv wird mit dieser Heap-Konfiguration erstellt. Wenn zur Laufzeit ein anderer GC
69+ # aktiv ist, lehnt die JVM das Archiv mit "Loading static archive failed" ab.
70+ RUN /opt/jre/bin/java -XX:+UseZGC -Xshare:dump
6971
7072# CDS Archiv generieren
7173# 1. Liste der Klassen erstellen (Training)
7274# WICHTIG: Wir nutzen /custom-jre/bin/java, damit das Archiv zum JRE passt!
7375# spring.context.exit weist Spring Boot an, den Application Context aufzubauen (damit alle Klassen geladen werden),
7476# aber die App sofort danach sauber zu beenden
7577# Training gegen die entpackten Layer (muss identisch zum Start sein!)
76- RUN /custom- jre/bin/java -XX:ArchiveClassesAtExit=app.jsa \
78+ RUN /opt/ jre/bin/java -XX:+UseZGC -XX:ArchiveClassesAtExit=app.jsa \
7779 -Dspring.context.exit=onRefresh \
7880 -Dspring.aot.enabled=true \
7981 -cp "extracted/dependencies/*:extracted/observability-dependencies/*:extracted/snapshot-dependencies/*:extracted/application/" \
8082 org.springframework.boot.loader.launch.JarLauncher || [ -f app.jsa ]
81- # Hinweis: Das "|| true " ist wichtig, da die App beim Training mangels DB/Config evtl. abbricht,
82- # aber das Archiv trotzdem schreibt.
83+ # Hinweis: Das "|| [ -f app.jsa ] " ist wichtig, da die App beim Training mangels DB/Config evtl. abbricht,
84+ # aber das Archiv trotzdem schreibt. Der Exit-Code 1 ist nur akzeptabel, wenn app.jsa existiert.
8385
8486# ============================
8587# 3. Runtime Stage (Minimales OS)
@@ -92,8 +94,8 @@ LABEL org.opencontainers.image.title="Java kubernetes event client with Custom J
9294
9395WORKDIR /app
9496
95- # Kopiere das Custom JRE aus der Build-Stage
96- COPY --from=build /custom- jre /opt/jre
97+ # Kopiere das Custom JRE aus der Build-Stage (wurde direkt nach /opt/jre gebaut)
98+ COPY --from=build /opt/ jre /opt/jre
9799ENV PATH="/opt/jre/bin:$PATH"
98100
99101USER nonroot
@@ -120,6 +122,7 @@ ENTRYPOINT [ \
120122 "-XX:InitialRAMPercentage=40", \
121123 "-XX:+UseZGC", \
122124 "-XX:+ExitOnOutOfMemoryError", \
125+ "-Dfile.encoding=UTF-8", \
123126 "org.springframework.boot.loader.launch.JarLauncher", \
124127 "--spring.config.location=file:/app/config/application.properties" \
125128]
0 commit comments