> **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)
| 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 |
| 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` |
- **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)
<!-- JaCoCo: Coverage-Messung ohne Schwellwerte (Schwellen kommen in M9) -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco-maven-plugin.version}</version>
<executions>
<execution>
<id>jacoco-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-report</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<!-- Mutation-Tests via PIT; aktiviert mit: mvn -P mutation test
Schwellwerte werden erst in M9 gesetzt. -->
<profile>
<id>mutation</id>
<build>
<plugins>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.15.3</version>
<dependencies>
<!-- JUnit 5 Adapter für PIT (ohne dieses Plugin kann PIT keine JUnit-5-Tests laufen lassen) -->
<dependency>
<groupId>org.pitest</groupId>
<artifactId>pitest-junit5-plugin</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
<configuration>
<targetClasses>
<param>de.gecheckt.asv.*</param>
</targetClasses>
<targetTests>
<param>de.gecheckt.asv.*</param>
</targetTests>
</configuration>
<executions>
<execution>
<id>pit-mutation</id>
<phase>test</phase>
<goals>
<goal>mutationCoverage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.