- bootstrap-gradle.sh ersetzt durch init-exercises.sh mit --maven (Standard) und --gradle
- --gradle: verteilt Wrapper (JAR + properties + gradlew) in alle Übungsverzeichnisse
(vorlagen/, livecoding/, spickzettel/), entfernt Maven-Artefakte (pom.xml,
.maven-dockerexclude); scheitert mit Fehler wenn Wrapper noch nicht bereit
- --maven: entfernt verteilte Gradle-Artefakte aus allen Übungsverzeichnissen
- Beide Modi: löschen Build-Ausgaben (target/, build/) und Caches (.gradle/)
- README-gradle.sh: enthält jetzt die Wrapper-Download-Logik mit --update-Schalter;
ohne --update scheitert es laut, wenn installierte Version nicht zur benötigten passt
- .gitignore: gradle/wrapper/.gradle-version (Versions-Marker) ergänzt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 00:40:38 +0000 (00:40 +0000)]
bootstrap-gradle.sh: --distribute auf build.gradle als Detektor umgestellt
gradle-wrapper.properties ist nicht in allen Gradle-Übungsbranches vorhanden,
build.gradle hingegen immer. Zielpfade entsprechend direkt aus dem
Übungsverzeichnis berechnet; gradle/wrapper/ wird bei Bedarf angelegt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 29 May 2026 23:14:31 +0000 (23:14 +0000)]
bootstrap-gradle.sh: Bootstrap-Skript für Gradle-Wrapper-JAR hinzugefügt
Erzeugt den fehlenden `gradle-wrapper.jar` entweder über eine lokale
Gradle-Installation oder durch direkten Download von GitHub. Mit
`--distribute` wird der JAR auch in alle Geschwister-Übungsverzeichnisse
kopiert (setzt TGZ-Verzeichnisstruktur voraus, in der Branch-Namen die
Verzeichnishierarchie abbilden).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 29 May 2026 23:14:26 +0000 (23:14 +0000)]
Gradle-Wrapper-Dateien hinzugefügt (ohne JAR)
`gradlew` und `gradle-wrapper.properties` sind Textdateien und können
problemlos versioniert werden. Der binäre `gradle-wrapper.jar` hingegen
wird von Mail-Sicherheitsfiltern blockiert und daher explizit aus dem
Repository ausgeschlossen (`.gitignore` entsprechend angepasst).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Vorteile:
- Kein Dockerfile nötig
- Beide Build-Systeme verwenden dieselbe Methode
- Image folgt automatisch Best Practices (non-root, layered JAR)
- jib-maven-plugin und gradle-git-properties waren bereits durch Rebase
vorhanden; jib entfällt zugunsten des Spring-Boot-eigenen build-image
Außerdem: springBoot { buildInfo() } in Gradle ergänzt, analog zum
build-info-Goal des spring-boot-maven-plugin (bereits in Maven konfiguriert).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Wed, 12 Mar 2025 05:53:08 +0000 (06:53 +0100)]
`ExampleProducer` in eine Spring-Boot App umgebaut (ohne Spring Kafka)
* Validierung der Properties aktiviert
* Steuerung und Abfrage über die Actuator-REST-API von ermöglicht
* Namespace für Konfig von `producer` in `juplo.producer` geändert
* In der Configuration wird das Interface des `KafkaProducer` übergeben
* Producerspezifische Properties werden in eigener nested Class verwaltet
** Dadurch wird der Code übersichtlicher, wenn spätere Implementierungen
_sowohl_ als Consumer, _als auch_ als Producer agieren!
* Das Throttling kann über `juplo.producer.throttle-ms` gesteuert werden
* `delivery.timeout.ms` und `request.timeout.ms` noch weiter gesenkt
* `max.block.ms` auf 5s gesetzt
** Sonst entsteht bei verschiedenen Fehlern schnell ein falscher Eindruck
** Man könnte sonst auf die Idee kommen, dass der Producer für diese
beliebig lange wartet!
* Eine Exception im Producer löst das Beenden der App aus
* Fix: `close()` muss noch vom `ExampleProducer` aufgerufen werden
** Der Aufruf von `close()` löst das Versenden wartender Nachrichten aus.
** Wenn die Methode erst von Spring aufgerufen wird, werden ggf. noch
Nachrichten konsumiert, nachdem der `ExampleProducer` bereits
ausgegeben hat, wieviele Nachrichten er insgesamt verarbeitet hat.
* `delivery.timeout.ms` konfigurierbar gemacht
* `max.block.ms` konfigurierbar gemacht
* `buffer.memory` konfigurierbar gemacht
.dockerignore und .maven-dockerinclude gehören zum alten
Dockerfile/fabric8-basierten Build-Workflow und werden von
Jib bzw. bootBuildImage nicht benötigt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sat, 23 May 2026 06:55:54 +0000 (06:55 +0000)]
refactor: Dockerfile und manuelle Jar-Packaging-Konfiguration entfernen
Seit der Umstellung auf Jib ist das Dockerfile nicht mehr nötig.
maven-dependency-plugin und maven-jar-plugin-Konfiguration (Classpath-
Manifest) waren nur für den manuellen Docker-Build-Weg erforderlich.
Jib übernimmt das Packaging vollständig; mainClass ist nun explizit
in der Jib-Konfiguration gesetzt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 22 May 2026 12:39:00 +0000 (12:39 +0000)]
refactor: Docker-Build von fabric8/bmuschko auf Jib umstellen
Maven nutzte das io.fabric8:docker-maven-plugin mit einem handgepflegten
Dockerfile. Gradle kopierte das JAR umständlich in ein target/-Verzeichnis,
damit dasselbe Dockerfile funktioniert (COPY target/*.jar).
Beide Build-Systeme nutzen jetzt Jib (com.google.cloud.tools:jib-maven-plugin
bzw. com.google.cloud.tools.jib), das direkt aus den compilierten Klassen
und Abhängigkeiten ein OCI-Image erzeugt:
Maven: mvn package (jib:dockerBuild ist an package-Phase gebunden)
Gradle: ./gradlew jibDockerBuild
Für den Registry-Push:
Maven: mvn jib:build
Gradle: ./gradlew jib
Vorteile:
- Kein Dockerfile mehr nötig (kein Kopier-Hack in Gradle)
- Beide Build-Systeme verwenden dieselbe Methode
- Optimiertes Layering (Abhängigkeiten in separaten Layern)
- Kein laufender Docker-Daemon für den Build nötig
Außerdem: gradle-git-properties Plugin hinzugefügt, analog zum
git-commit-id-plugin in Maven.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 22 May 2026 12:38:32 +0000 (12:38 +0000)]
fix: Lombok in Maven korrekt als optional deklarieren
Lombok war mit <scope>compile</scope> deklariert, was dazu führt, dass
es als transitive Abhängigkeit weitergegeben wird. Da Lombok ein reines
Compile-Zeit-Tool (Annotation Processor) ist, muss es als <optional>true</optional>
markiert werden. Der Spring-Boot-Maven-Plugin schließt optionale
Abhängigkeiten automatisch aus dem fat-JAR aus.
Das Gradle-Setup ist in diesem Punkt bereits korrekt (compileOnly +
annotationProcessor).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 15 Mar 2026 09:00:49 +0000 (10:00 +0100)]
Limits für die Definition des Service `producer` ergänzt
* Dadurch wird die Gefahr eingegrenzt, dass der Arbeitsplatz eines TN
überlastet wird.
* Dies ist einigen TN passiert, weil sie den `ExampleProducer` ohne
`Thread.sleep(500)` als Image gebaut haben.
* Wenn dieser dann unbedacht im Hintergrund weiterläuft, kann das den
Rechner schnell lahm legen...
Kai Moritz [Sun, 11 Jun 2023 11:55:20 +0000 (13:55 +0200)]
Docker-Setup auf `bitnami/kafka:3.4` aktualisiert und vereinfacht
* Die Konfiguration musste an (undokumentierte?!) Änderungen in der
version 3.4 von `bitnami/kafka` angepasst werden.
* Die drei Broker spielen jetzt gleichzeitig Controller. D.h., der
Service `kafka-0`, der explizit Controller gespielt hat, fällt weg.
Kai Moritz [Thu, 8 Jun 2023 08:35:41 +0000 (10:35 +0200)]
Bedienbarkeit des Setups verbessert
* Setup starten mit `docker-compose up -t0 -d cli`
** Dabei wird _nicht_ automatisch das Topic `test` neu angelegt
** D.h., die Daten gehen nicht unbeabsichtigt verloren, wenn man mit
`up -d` prüft, ob noc alles läuft!
* Das Topic `test` kan mit `docker-compose restart -t0 setup` explizit
gelöscht und neu angelegt (aka geleert) werden.
Kai Moritz [Fri, 22 Jul 2022 18:04:07 +0000 (20:04 +0200)]
Upgrade von Spring Boot und den Confluent-Kafka-Images
* Upgrade der Kafk-Images von Confluent 7.0.2 auf 7.1.3
** Unterstützt Kafka 3.1.x (siehe https://docs.confluent.io/platform/current/installation/versions-interoperability.html[Versions-Matrix])
* Upgrade für Spring Boot von 2.6.5 auf 2.7.2
** Enthält Kafka: 3.1.1
** Enthält Spring Kafka: 2.8.8