diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 568078fd..3b18c2ff 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -69,26 +69,27 @@ jobs:
- name: Build with Maven
run: mvn -B install -Pmetrics --file pom.xml
- - name: Check for uncommitted generated source changes
+ - name: Verify committed generated example builders
if: github.event_name == 'pull_request'
run: |
- echo "Checking for uncommitted generated source changes..."
-
- # Check if there are any changes in generated-sources directories
- if git diff --name-only HEAD | grep -E "target/generated-sources/"; then
- echo "❌ ERROR: Found uncommitted generated source changes!"
- echo ""
- echo "The following generated files have changed:"
- git diff --name-only HEAD | grep -E "target/generated-sources/" | sed 's/^/ /'
- echo ""
- echo "Please commit these changes to the repository:"
- echo " git add target/generated-sources/"
- echo " git commit -m \"Update generated sources\""
- echo ""
+ # Regenerate the example builders from a clean slate into their tracked
+ # directory. Deleting first means a *missing* builder (generator
+ # regression) shows up as a git deletion, stale output as a
+ # modification, and a brand-new builder as an untracked file — so any
+ # drift fails the check. (Dependencies were installed by the build step
+ # above, so -pl example is sufficient here.)
+ rm -rf example/generated-example-builder
+ mvn -B -q -DskipTests -pl example clean compile
+
+ CHANGES="$(git status --porcelain -- example/generated-example-builder)"
+ if [ -n "$CHANGES" ]; then
+ echo "::error::Committed generated example builders are out of date or missing."
+ echo "Run 'mvn -pl example clean compile' and commit example/generated-example-builder/."
+ echo "$CHANGES"
+ git --no-pager diff -- example/generated-example-builder
exit 1
- else
- echo "✅ No uncommitted generated source changes found"
fi
+ echo "Committed generated example builders are up to date."
- name: Package Sonar analysis inputs (fork PRs)
if: always() && github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository
diff --git a/README.md b/README.md
index aee09d2d..a500be14 100644
--- a/README.md
+++ b/README.md
@@ -316,24 +316,24 @@ A comprehensive example showcasing all fundamental Java property types with a mi
- **Source DTO**: [`BookDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/BookDto.java) - Demonstrates all primitive types, collections, Optional, BigDecimal, date/time types, and nested objects
- **Custom Annotation**: [`@ElementaryBuilder`](example/src/main/java/org/javahelpers/simple/builders/example/ElementaryBuilder.java) - A template annotation that disables all advanced features (suppliers, consumers, collection builders, With interface, @Generated annotation)
-- **Generated Builder**: [`BookDtoBuilder.java`](example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/BookDtoBuilder.java) - Clean, minimal builder with only setter methods
+- **Generated Builder**: [`BookDtoBuilder.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/BookDtoBuilder.java) - Clean, minimal builder with only setter methods
- **Tests**: [`BookDtoBuilderTest.java`](example/src/test/java/org/javahelpers/simple/builders/example/BookDtoBuilderTest.java) - Usage examples
### Full-Featured Examples
Examples with all builder features enabled:
-- **Person DTO**: [`PersonDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/PersonDto.java) and [`PersonDtoBuilder.java`](example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/PersonDtoBuilder.java) - Demonstrates nested objects, collections, suppliers, conditional logic, and various setter patterns
+- **Person DTO**: [`PersonDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/PersonDto.java) and [`PersonDtoBuilder.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/PersonDtoBuilder.java) - Demonstrates nested objects, collections, suppliers, conditional logic, and various setter patterns
- **Usage Examples**: [`PersonDtoBuilderTest.java`](example/src/test/java/org/javahelpers/simple/builders/example/PersonDtoBuilderTest.java) - Shows supplier methods, collection builders, nested builder consumers, and conditional logic
-- **Product Record**: [`ProductRecord.java`](example/src/main/java/org/javahelpers/simple/builders/example/ProductRecord.java) and [`ProductRecordBuilder.java`](example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/ProductRecordBuilder.java) - Java Record support with full builder features and With interface pattern
+- **Product Record**: [`ProductRecord.java`](example/src/main/java/org/javahelpers/simple/builders/example/ProductRecord.java) and [`ProductRecordBuilder.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/ProductRecordBuilder.java) - Java Record support with full builder features and With interface pattern
- **Usage Examples**: [`ProductRecordTest.java`](example/src/test/java/org/javahelpers/simple/builders/example/ProductRecordTest.java) - Comprehensive tests demonstrating With interface for immutable Records, fluent modifications, and custom with methods
### Advanced Features
Examples demonstrating special annotations and nested object relationships:
-- **Sponsor DTO**: [`SponsorDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/SponsorDto.java) and [`SponsorDtoBuilder.java`](example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java) - Simple DTO used as nested object in other examples
-- **Mannschaft DTO**: [`MannschaftDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/MannschaftDto.java) and [`MannschaftDtoBuilder.java`](example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java) - Demonstrates `@IgnoreInBuilder` annotation to exclude specific setter methods from the generated builder, plus Set collections with nested objects
+- **Sponsor DTO**: [`SponsorDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/SponsorDto.java) and [`SponsorDtoBuilder.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java) - Simple DTO used as nested object in other examples
+- **Mannschaft DTO**: [`MannschaftDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/MannschaftDto.java) and [`MannschaftDtoBuilder.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java) - Demonstrates `@IgnoreInBuilder` annotation to exclude specific setter methods from the generated builder, plus Set collections with nested objects
These examples serve as both documentation and integration tests for the annotation processor.
diff --git a/example/.gitignore b/example/.gitignore
deleted file mode 100644
index 6dbe5dc8..00000000
--- a/example/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Include generated sources (they're ignored by main .gitignore)
-!/target/generated-sources/
-!/target/generated-test-sources/
diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/BookDtoBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/BookDtoBuilder.java
similarity index 100%
rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/BookDtoBuilder.java
rename to example/generated-example-builder/org/javahelpers/simple/builders/example/BookDtoBuilder.java
diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/JacksonIntegrationDtoBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/JacksonIntegrationDtoBuilder.java
similarity index 100%
rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/JacksonIntegrationDtoBuilder.java
rename to example/generated-example-builder/org/javahelpers/simple/builders/example/JacksonIntegrationDtoBuilder.java
diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java
similarity index 100%
rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java
rename to example/generated-example-builder/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java
diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/PersonDtoBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/PersonDtoBuilder.java
similarity index 100%
rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/PersonDtoBuilder.java
rename to example/generated-example-builder/org/javahelpers/simple/builders/example/PersonDtoBuilder.java
diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/ProductRecordBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/ProductRecordBuilder.java
similarity index 100%
rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/ProductRecordBuilder.java
rename to example/generated-example-builder/org/javahelpers/simple/builders/example/ProductRecordBuilder.java
diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/SimpleBuildersJacksonModule.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/SimpleBuildersJacksonModule.java
similarity index 100%
rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/SimpleBuildersJacksonModule.java
rename to example/generated-example-builder/org/javahelpers/simple/builders/example/SimpleBuildersJacksonModule.java
diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java
similarity index 100%
rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java
rename to example/generated-example-builder/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java
diff --git a/example/pom.xml b/example/pom.xml
index 8a9146f9..a1ad407a 100644
--- a/example/pom.xml
+++ b/example/pom.xml
@@ -80,7 +80,10 @@
${java.version}${java.version}${java.version}
- ${project.build.directory}/generated-sources/annotations
+
+ ${project.basedir}/generated-example-builder