#!/usr/bin/env bash # Regenerates every file in output/. Needs a JDK 25 and Maven 3.9+ on the PATH. Run from anywhere. set -uo pipefail cd "$(dirname "$0")/.." ROOT="$PWD" OUT="$ROOT/output" mkdir -p "$OUT" strip() { grep -v -E 'JAVA_TOOL_OPTIONS|^WARNING: (A terminally|sun\.misc|Please consider)' | sed "s#$ROOT/##g"; } echo "[1/7] build + tests (writes output/09-processor-harness.txt)" mvn -B -q clean test 2>&1 | strip | tail -5 # 10: surefire summaries { for f in processor/target/surefire-reports/*.txt demo/target/surefire-reports/*.txt; do cat "$f"; echo; done; } > "$OUT/10-tests.txt" D=demo/src/main/java/com/ankurm/demo CLS=demo/target/classes PROC=processor/target/classes TMP="$(mktemp -d)" trap 'rm -rf "$TMP"' EXIT echo "[2/7] reflection + retention demos" java -cp "$CLS" com.ankurm.demo.RetentionDemo 2>&1 | strip > "$OUT/01-retention-reflection.txt" java -cp "$CLS" com.ankurm.demo.RuntimeValidatorDemo 2>&1 | strip > "$OUT/02-runtime-validator.txt" { for c in 'RetentionDemo$Base'; do echo "javap -v -p -cp demo/target/classes com.ankurm.demo.$c (filtered)" javap -v -p -cp "$CLS" "com.ankurm.demo.$c" 2>&1 | grep -E 'Runtime(In)?[Vv]isibleAnnotations:|^ com\.ankurm' echo "occurrences of SourceOnly in the class file: $(javap -v -p -cp "$CLS" "com.ankurm.demo.$c" 2>&1 | grep -c SourceOnly)" done } > "$OUT/03-javap-retention.txt" echo "[3/7] generated source + builder usage" cp demo/target/generated-sources/annotations/com/ankurm/demo/PersonBuilder.java "$OUT/04-generated-PersonBuilder.java.txt" java -cp "$CLS" com.ankurm.demo.BuilderUsageDemo 2>&1 | strip > "$OUT/05-builder-usage.txt" echo "[4/7] compile error via Messager" { echo '$ javac -processorpath processor/target/classes -d bad/Shape.java' javac -cp "$PROC" -processorpath "$PROC" -d "$TMP" bad/Shape.java 2>&1 | strip echo "exit=${PIPESTATUS[0]}" } > "$OUT/06-compile-error.txt" { echo '$ javac -cp demo/target/classes -d bad/WrongTarget.java' javac -cp "$CLS" -d "$TMP/t" bad/WrongTarget.java 2>&1 | strip echo "exit=${PIPESTATUS[0]}" } > "$OUT/11-wrong-target.txt" echo "[5/7] JDK 25 and the processor on the classpath only" S="$D/Person.java $D/Pizza.java $D/BuilderUsageDemo.java" { echo '$ javac -version' javac -version 2>&1 | strip echo echo '$ javac -cp processor/target/classes -d Person.java Pizza.java BuilderUsageDemo.java' javac -cp "$PROC" -d "$TMP/a" $S 2>&1 | strip echo "exit=${PIPESTATUS[0]}" echo echo '$ javac -Xlint:all -cp processor/target/classes -d Person.java' javac -Xlint:all -cp "$PROC" -d "$TMP/b" "$D/Person.java" 2>&1 | strip echo "exit=${PIPESTATUS[0]} (no output at all: nothing warned that a processor was skipped)" echo echo '$ javac -cp processor/target/classes -proc:full -d Person.java Pizza.java BuilderUsageDemo.java' javac -cp "$PROC" -proc:full -d "$TMP/c" $S 2>&1 | strip echo "exit=${PIPESTATUS[0]}" echo echo '$ javac -cp processor/target/classes -processorpath processor/target/classes -d Person.java Pizza.java BuilderUsageDemo.java' javac -cp "$PROC" -processorpath "$PROC" -d "$TMP/d" $S 2>&1 | strip echo "exit=${PIPESTATUS[0]}" } > "$OUT/07-jdk25-proc-default.txt" echo "[6/7] Maven: processor on the classpath only" { echo '$ mvn -B clean compile -Pclasspath-only # no annotationProcessorPaths' mvn -B clean compile -Pclasspath-only 2>&1 | strip | grep -E 'Compiling|COMPILATION ERROR|^\[ERROR\] demo/|BUILD' | awk '!s[$0]++' | head -12 echo echo '$ mvn -B clean compile -Pclasspath-proc-full # same, plus full' mvn -B clean compile -Pclasspath-proc-full 2>&1 | strip | grep -E 'Compiling|COMPILATION ERROR|^\[ERROR\] demo/|BUILD' | awk '!s[$0]++' | head -12 } > "$OUT/08-maven-classpath-only.txt" echo "[7/7] restore a normal build" mvn -B -q clean test 2>&1 | strip | tail -5 echo "Done. output/ regenerated."