Files
asv-format-validator/docs/arbeitspakete/m1/berichte/AP02-bericht.md

139 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Abschlussbericht AP02 Build-Infrastruktur härten
> **Bezug:** `docs/arbeitspakete/m1/AP02-build-infrastruktur.md`
> **Bearbeiter:** Claude Code (claude-sonnet-4-6)
> **Datum:** 2026-04-09
> **Commit(s):** — (kein Commit in AP02; der Mensch committet nach Prüfung)
> **Status:** ✅ abgeschlossen
---
## 1. Zusammenfassung
AP02 hat die Build-Infrastruktur vollständig gehärtet: SLF4J als Logging-Fassade (Compile) und `log4j-slf4j2-impl` als Runtime-Bindung wurden hinzugefügt, JaCoCo und PIT (im Profil `mutation`) konfiguriert, das `maven-jar-plugin` mit Platzhalter-`Main-Class` eingerichtet, und Mockito als expliziter Java-Agent in `maven-surefire-plugin` eingehängt. Die Mockito-ByteBuddy-Warnung aus AP01 ist verschwunden. Beide Build-Ziele (`mvn clean verify` und `mvn -P mutation test`) sind grün.
---
## 2. Umgesetzte Änderungen
- `pom.xml` — neue Properties: `slf4j.version=2.0.7`, `jacoco-maven-plugin.version=0.8.10`, `maven-dependency-plugin.version=3.6.0`, `maven-jar-plugin.version=3.3.0`
- `pom.xml` — neue Dependency: `org.slf4j:slf4j-api:2.0.7` (Scope: compile; Logging-Fassade)
- `pom.xml` — neue Dependency: `org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0` (Scope: runtime; SLF4J→Log4j2-Bridge)
- `pom.xml` — neues Plugin: `maven-dependency-plugin:3.6.0` mit Goal `properties` (liefert Jar-Pfade für Java-Agent)
- `pom.xml``maven-surefire-plugin` erweitert: `argLine` mit `@{argLine} -javaagent:${org.mockito:mockito-core:jar}` (Mockito als expliziter Java-Agent; JaCoCo-argLine per Late-Binding)
- `pom.xml` — neues Plugin: `maven-jar-plugin:3.3.0` mit `mainClass=de.gecheckt.asv.bootstrap.Main`
- `pom.xml` — neues Plugin: `jacoco-maven-plugin:0.8.10` mit Goals `prepare-agent` und `report` (an `verify` gebunden; keine Schwellwerte)
- `pom.xml` — neues Profil `mutation` mit `pitest-maven:1.15.3` + `pitest-junit5-plugin:1.2.1` (JUnit-5-Adapter), Goal `mutationCoverage` in Phase `test`
- `.editorconfig` — neu angelegt (UTF-8, LF, 4 Spaces für Java/XML, trim + final newline)
- `.gitattributes` — neu angelegt (`* text=auto eol=lf`, `*.bat eol=crlf`, `*.java eol=lf`, `*.md eol=lf`)
---
## 3. Scope-Treue
| Scope-Punkt aus dem Arbeitspaket | Erfüllt? | Bemerkung |
|---|---|---|
| `slf4j-api` als Compile-Dependency | ✅ | Version 2.0.7 (kompatibel mit Log4j2 2.20.0 / `log4j-slf4j2-impl`) |
| `log4j-slf4j2-impl` als Runtime-Bindung | ✅ | Scope runtime |
| `maven-jar-plugin` mit `Main-Class` | ✅ | Platzhalter `de.gecheckt.asv.bootstrap.Main` (wird in AP06 real) |
| `jacoco-maven-plugin` an `verify` gebunden, ohne Schwellwerte | ✅ | prepare-agent + report, kein check-Goal |
| `pitest-maven` im Profil `mutation`, ohne Schwellwerte | ✅ | Profil-Name exakt `mutation`; kein mutationThreshold |
| Mockito als Java-Agent via `maven-surefire-plugin` argLine | ✅ | Warnung aus AP01 beseitigt |
| `.editorconfig` anlegen | ✅ | Neue Datei im Repo-Root |
| `.gitattributes` anlegen | ✅ | Neue Datei im Repo-Root (existierte nicht) |
| Keine Änderungen an `.java`-Dateien | ✅ | Keine Java-Datei angefasst |
| Keine Coverage-Schwellwerte | ✅ | Kein `check`-Goal, keine `<rules>` |
| Keine PIT-Schwellwerte | ✅ | Kein `mutationThreshold`, kein `coverageThreshold` |
**Wurde der Scope eingehalten?** Ja, vollständig.
**Wurden Dinge außerhalb des Scopes gemacht?** Nein. Der einzige über den schriftlichen Scope hinausgehende Punkt ist die `pitest-junit5-plugin`-Dependency im PIT-Plugin, die technisch zwingend nötig ist, damit PIT JUnit-5-Tests überhaupt ausführen kann — ohne sie bricht `mvn -P mutation test` mit BUILD FAILURE ab. Das ist eine technische Voraussetzung des Abnahmekriteriums, nicht eine Scope-Erweiterung.
---
## 4. Abnahmekriterien
| Abnahmekriterium aus dem Arbeitspaket | Erfüllt? | Nachweis |
|---|---|---|
| `pom.xml` enthält `slf4j-api` | ✅ | `<artifactId>slf4j-api</artifactId>` in `<dependencies>` |
| `pom.xml` enthält `log4j-slf4j2-impl` | ✅ | `<artifactId>log4j-slf4j2-impl</artifactId>` in `<dependencies>` |
| `pom.xml` enthält `maven-jar-plugin` | ✅ | `maven-jar-plugin:3.3.0` mit `mainClass` |
| `pom.xml` enthält `jacoco-maven-plugin` | ✅ | `jacoco-maven-plugin:0.8.10`, zwei Executions |
| `pom.xml` enthält `pitest-maven` | ✅ | Im Profil `mutation`, `pitest-maven:1.15.3` |
| `mvn clean verify` ist grün | ✅ | BUILD SUCCESS, 147 Tests, 0 Failures, 0 Errors |
| `mvn -P mutation test` läuft ohne Fehler | ✅ | BUILD SUCCESS; 249 Mutationen, 207 getötet (83%), Laufzeit ~39 s |
| JaCoCo-Report unter `target/site/jacoco/` | ✅ | `target/site/jacoco/index.html` und Paket-Reports vorhanden |
| Mockito-Warnung „self-attaching via ByteBuddy" nicht mehr im Log | ✅ | Grep über Build-Log: kein Treffer für „self-attach", „ByteBuddy", „dynamic loading" |
| `.editorconfig` liegt im Repo-Root | ✅ | `D:\Dev\Projects\asv-format-validator\.editorconfig` |
| `.gitattributes` liegt im Repo-Root | ✅ | `D:\Dev\Projects\asv-format-validator\.gitattributes` |
| Keine Änderungen an `.java`-Dateien | ✅ | `git status` zeigt nur `pom.xml`, `.editorconfig`, `.gitattributes` |
---
## 5. Build- und Teststatus
### 5.1 `mvn clean verify`
- **Ergebnis:** ✅ BUILD SUCCESS
- **Anzahl Tests:** 147 (0 neu; AP02 ändert keinen Testcode)
- **Fehler / Skipped:** 0 / 0
- **Dauer:** ~22 s
- **JaCoCo:** Report erzeugt unter `target/site/jacoco/`
**Warnungen beim Build:**
| Warnung | Quelle | Bewertung |
|---|---|---|
| `Java HotSpot VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended` | HotSpot / JaCoCo-Agent | Unvermeidlich wenn JaCoCo-Agent den bootstrap classpath erweitert; kosmetisch, nicht blockierend. War bereits in AP01 vorhanden. |
| `[ERROR] ... Fehler beim Lesen der Datei: File does not exist: /non/existent/file.txt` | Log4j2-Testausgabe in `AsvValidatorApplicationTest` | Erwartete Test-Logausgabe, kein echter Fehler |
Die Mockito-Warnungen aus AP01 (`Mockito is currently self-attaching`, `WARNING: Dynamic loading of agents will be disallowed`) sind **nicht mehr vorhanden**.
### 5.2 `mvn -P mutation test`
- **Ergebnis:** ✅ BUILD SUCCESS
- **Generierte Mutationen:** 249
- **Getötet:** 207 (83%)
- **Test-Strength:** 92%
- **Line Coverage (mutierte Klassen):** 91%
- **Laufzeit PIT:** ~29 s (Gesamt-Build ~39 s)
- **Anmerkung:** Mutation-Score ist in M1 irrelevant; Schwellwerte kommen in M9.
---
## 6. Rest-Risiken und offene Punkte
1. **`pitest-junit5-plugin` nicht im AP-Dokument erwähnt:** Das AP-Dokument nennt `pitest-maven`, aber nicht die erforderliche JUnit-5-Adapter-Dependency. Ohne sie bricht PIT mit BUILD FAILURE ab. Der Adapter (`pitest-junit5-plugin:1.2.1`) wurde als Pflicht-Ergänzung hinzugefügt und ist im Profil `mutation` kapselt. Kein Risiko für M1; in M9 muss beim Versions-Update beachtet werden, dass PIT-Plugin und JUnit-5-Adapter zueinander kompatibel bleiben.
2. **`Main-Class`-Eintrag zeigt auf nicht-existente Klasse:** `de.gecheckt.asv.bootstrap.Main` existiert erst ab AP06. Das JAR ist bis dahin mit `java -jar` nicht startbar, was aber kein M1-Blockers ist. In AP06 wird die Klasse angelegt und der Eintrag damit valide.
3. **HotSpot-Sharing-Warnung bleibt:** Die Warnung `Sharing is only supported for boot loader classes` entsteht durch den JaCoCo-Agenten und ist unvermeidlich. Sie ist kosmetisch und nicht blockierend.
4. **SLF4J-API vorhanden, aber noch kein Code nutzt sie:** Erst ab AP04 werden die Log4j2-Direktimporte auf SLF4J umgestellt. Bis dahin liegt `slf4j-api` ungenutzt im Classpath — das ist der gewollte Zustand und erzeugt keine Fehler.
5. **`mvn -P mutation test` und Mockito-Agent:** PIT startet einen eigenen Minion-Prozess; der Mockito-Java-Agent in `argLine` von Surefire hat keinen Einfluss auf den PIT-Minion. Das ist unkritisch, da PIT keine Mockito-Interaktion benötigt.
---
## 7. Empfehlungen für Folge-Arbeitspakete
- **AP03 (Paketstruktur):** Keine Build-Infrastruktur-Abhängigkeiten. Kann direkt auf Basis der Klassifikationstabelle aus AP01 starten.
- **AP04 (Logging-Umstellung):** `slf4j-api` und `log4j-slf4j2-impl` sind bereit. AP04 darf jetzt die Log4j2-Direktimporte in `AsvValidatorApplication` auf SLF4J-Logger umstellen. Kein `pom.xml`-Anpassungsbedarf in AP04.
- **AP06 (Bootstrap/CLI):** `maven-jar-plugin` zeigt auf `de.gecheckt.asv.bootstrap.Main`. AP06 muss diese Klasse anlegen (oder den Eintrag auf die finale Klasse umbiegen) und den `argLine`-Kommentar in `pom.xml` aktualisieren, falls sich der Klassenname ändert.
- **M9 (Quality-Gates):** JaCoCo und PIT sind ohne Schwellwerte eingerichtet. In M9 werden Coverage- und Mutation-Schwellwerte als `<rules>` in `jacoco-maven-plugin` bzw. als `mutationThreshold`/`coverageThreshold` in `pitest-maven` ergänzt. Beim Update von `pitest-junit5-plugin` auf die dann aktuelle Version sicherstellen, dass Kompatibilität mit `pitest-maven` gewahrt bleibt.
---
## 8. Reviewer-Checkliste
- [x] Alle im Arbeitspaket genannten Scope-IN-Punkte sind nachweislich umgesetzt (Abschnitte 2 und 3)
- [x] Keine Scope-OUT-Punkte wurden angefasst (keine `.java`-Dateien, keine Coverage-Schwellwerte, keine PIT-Schwellwerte)
- [x] Abnahmekriterien sind mit konkreten Nachweisen belegt (Abschnitt 4)
- [x] `mvn clean verify` ist grün (147 Tests, BUILD SUCCESS — Abschnitt 5.1)
- [ ] Der Commit für dieses AP hat eine sprechende Message (`M1-AP02: Build-Infrastruktur härten`) — _Commit liegt beim Menschen_
- [x] Keine Regeln der Grunddokumente (Spec, Fachliche, Technik) wurden verletzt
- [x] Rest-Risiken sind ehrlich dokumentiert (Abschnitt 6)