From d0aac6a9acee96f7e3c6f05fc56c718e83140a51 Mon Sep 17 00:00:00 2001 From: Marcus van Elst Date: Thu, 9 Apr 2026 07:12:14 +0200 Subject: [PATCH] =?UTF-8?q?M1-AP02:=20Build-Infrastruktur=20h=C3=A4rten=20?= =?UTF-8?q?(SLF4J,=20JaCoCo,=20PIT,=20JAR-Plugin,=20Mockito-Agent)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 21 +++ .gitattributes | 5 + .../arbeitspakete/m1/berichte/AP02-bericht.md | 138 +++++++++++++++++ pom.xml | 143 ++++++++++++++++-- 4 files changed, 295 insertions(+), 12 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 docs/arbeitspakete/m1/berichte/AP02-bericht.md diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..151a451 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# EditorConfig — https://editorconfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.java] +indent_style = space +indent_size = 4 + +[*.xml] +indent_style = space +indent_size = 4 + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c3d1c75 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Git-Attribute — Zeilenenden normalisieren +* text=auto eol=lf +*.bat text eol=crlf +*.java text eol=lf +*.md text eol=lf diff --git a/docs/arbeitspakete/m1/berichte/AP02-bericht.md b/docs/arbeitspakete/m1/berichte/AP02-bericht.md new file mode 100644 index 0000000..5ccbe48 --- /dev/null +++ b/docs/arbeitspakete/m1/berichte/AP02-bericht.md @@ -0,0 +1,138 @@ +# 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 `` | +| 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` | ✅ | `slf4j-api` in `` | +| `pom.xml` enthält `log4j-slf4j2-impl` | ✅ | `log4j-slf4j2-impl` in `` | +| `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 `` 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) diff --git a/pom.xml b/pom.xml index b556686..e03e591 100644 --- a/pom.xml +++ b/pom.xml @@ -6,40 +6,59 @@ de.gecheckt asv-format-validator 0.0.1-SNAPSHOT - + 21 - + UTF-8 UTF-8 - + 2.20.0 + 2.0.7 5.9.2 5.23.0 - + 3.11.0 + 3.6.0 + 3.3.0 3.0.0 + 0.8.10 - + - + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + + org.apache.logging.log4j + log4j-slf4j2-impl + ${log4j.version} + runtime + + + org.apache.logging.log4j log4j-api ${log4j.version} - + org.apache.logging.log4j log4j-core ${log4j.version} - + org.junit.jupiter @@ -47,7 +66,7 @@ ${junit.version} test - + org.mockito @@ -56,7 +75,7 @@ test - + @@ -67,12 +86,112 @@ 21 - + + + + org.apache.maven.plugins + maven-dependency-plugin + ${maven-dependency-plugin.version} + + + get-mockito-agent-path + + properties + + + + + org.apache.maven.plugins maven-surefire-plugin ${maven-surefire-plugin.version} + + + @{argLine} -javaagent:${org.mockito:mockito-core:jar} + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + de.gecheckt.asv.bootstrap.Main + + + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-maven-plugin.version} + + + jacoco-prepare-agent + + prepare-agent + + + + jacoco-report + verify + + report + + + - \ No newline at end of file + + + + + mutation + + + + org.pitest + pitest-maven + 1.15.3 + + + + org.pitest + pitest-junit5-plugin + 1.2.1 + + + + + de.gecheckt.asv.* + + + de.gecheckt.asv.* + + + + + pit-mutation + test + + mutationCoverage + + + + + + + + +