Changelog History
-
v00.11.01 Changes
May 28, 2026🚀 Release Notes
00.11.01 — 2026-05-28
🚀 Patch release that fixes the Maven Central deployment of the 00.11.00
🔋 feature set. Consumers should upgrade directly from 00.10.01 to
00.11.01 — the 00.11.00 artifacts never made it to Central because
the newproxybuilder-annotationsmodule was missing from the bundle.No source / API changes since 00.11.00; the full feature description
(module split, nine new annotations, processor wiring, downstream
🚀 smoke test, pitest baseline) lives inRELEASE_NOTES-00.11.00.md.What was broken in 00.11.00
🚀 The release flow uses
scripts/clean-bundle-for-central.shbecause
👀central-publishing-maven-plugin0.10.0 is not Maven-4-aware (see
🚀 the 00.10.00 release notes for the full story). That script copies
the publishable files directly out of~/.m2/repository/com/svenruppert/<module>/<version>/
based on a hardcodedMODULESarray — and that array was not
⚡️ updated when 00.11.00 introduced the newproxybuilder-annotations
module.Consequence:
central-bundle.zipshipped to the Central Portal
contained onlyproxybuilder-parentandproxybuilder. Anyone
➕ addingcom.svenruppert:proxybuilder-annotations:00.11.00to their
🏗 build got an unresolved dependency.🛠 Fixes
scripts/clean-bundle-for-central.sh:MODULESnow lists
proxybuilder-parent,proxybuilder-annotations,proxybuilder
(in that order — parent first, then the annotations dependency,
then the processor).proxybuilder-annotations/pom.xml: inline<licenses>,
<scm>,<developers>added. Central Portal validates each
artifact's POM directly and does not resolve<parent>for these
required fields; without them, the validator would have rejected
🛠 the bundle even if the script bug had been fixed.impl/pom.xml: same three inline blocks added preventively,
in case a future Central validator pass tightens the same check.
🚀 This was already flagged in the 00.10.00 release notes as the
↪ recommended workaround if Central ever rejected the bundle for
missing fields.
Verification
🚀 After the release flow:
./mvnw clean install -P release,_release_prepare ./scripts/clean-bundle-for-central.sh unzip -l target/central-publishing/central-bundle.zip \|grep -c proxybuilder-annotations# expected: \> 0unzip -l target/central-publishing/central-bundle.zip \|grep -c build.pom# expected: 0unzip -l target/central-publishing/central-bundle.zip \|grep -c consumer# expected: 0Coordinates
<dependency> <groupId>com.svenruppert</groupId> <artifactId>proxybuilder-annotations</artifactId> <version>00.11.01</version> </dependency> <annotationProcessorPaths> <path> <groupId>com.svenruppert</groupId> <artifactId>proxybuilder</artifactId> <version>00.11.01</version> </path> </annotationProcessorPaths>🚀 Recommended for future releases
The audit in
Anforderungen-proxybuilder-00.12.00.mdcollects the
✅ known correctness, test-coverage, architecture and feature gaps that
🚀 surfaced while preparing this release. -
v00.11.00 Changes
May 28, 2026🚀 Release proxybuilder 00.11.00
Module split:
- introduce com.svenruppert:proxybuilder-annotations as a tiny
🆓 dependency-free JAR containing every annotation the project ships,
plus the ProxyEnforcement helper and the ProxyBuilderVersion constant - 🆕 new JPMS module com.svenruppert.proxybuilder.annotations
- proxybuilder (impl)
requires transitivethe new module; consumers
put proxybuilder-annotations on their compile classpath and keep
proxybuilder only on<annotationProcessorPaths>, so JavaPoet,
Metrics and SLF4J no longer leak into the consumer compile classpath - register the new module in the root pom and in the parent
dependencyManagement - ⬆️ bump reactor to 00.11.00 across root pom, impl, testusage, README
and the jdeps example in the README
💥 Breaking change:
- ✂ remove com.svenruppert.proxybuilder.GeneratedByProxyBuilder (SOURCE
retention, single value() member). The new
com.svenruppert.proxybuilder.annotations.GeneratedByProxyBuilder is
⚙ RUNTIME retained and carries processor, sourceClass,
proxyBuilderVersion, date and comments
🆕 New annotations (Tier 1):
- GeneratedByProxyBuilder (RUNTIME, TYPE) - extended marker, emitted on
every wrapper, readable via reflection - SkipProxy (SOURCE, METHOD or CONSTRUCTOR) - exclude a single member
from proxy generation without resorting to final/private/static - ProxyBuilderOptions (SOURCE, TYPE) - per-type overrides for suffix,
0️⃣ failOnStaticMethods (DEFAULT/TRUE/FALSE) and excludeMethodNames
🆕 New annotations (Tier 2):
- ✅ DelegatesTo (RUNTIME, METHOD) - auto-emitted on every generated
💅 wrapper method, value is a JLS-style source-method reference - WrappedBy (RUNTIME, TYPE) - hand-applied on the original; pair with
ProxyEnforcement.requireWrapped to refuse un-wrapped instances at
⚙ runtime - Internal (CLASS, multiple targets) - marks proxybuilder-internal API
not intended for consumers
🆕 New annotations (Tier 3, minimal processor support):
- ProxyEntry (SOURCE, METHOD) - recognised; processor emits a
Diagnostic.Kind.NOTE explaining it is experimental - 📚 GeneratedSource (SOURCE, member targets) - manual documentation
marker; processor does not emit - ProxyName (SOURCE, TYPE) - per-class name pattern with {Original}
placeholder; beats ProxyBuilderOptions.suffix() and the global
suffix option
🖨 Processor wiring:
- createAnnotationSpecGenerated(TypeElement) populates the new
GeneratedByProxyBuilder members - applyProxyBuilderOptions(TypeElement) caches per-type suffix,
static-method policy, excludeMethodNames and name override; called
from both validateTargetType and the process forEach so validation
👀 and code emission see the same overrides - SkipProxy and excludeMethodNames integrate into the existing method
and constructor walks - ✅ defineDelegatorMethod adds an auto-generated DelegatesTo marker on
each generated wrapper method; functional-interface contracts skip it - 🆕 new compiler option proxybuilder.suppressDelegatesTo strips
✅ DelegatesTo from generated wrappers when set to true - targetClassNameSimpleForGeneratedClass consults ProxyName first,
then ProxyBuilderOptions.suffix(), then the global suffix option - failOnStaticMethods() consults the per-type override before the
global option - ProxyEntry emits Diagnostic.Kind.NOTE explaining it is no-op in
00.11.00 - Internal applied to MethodIdentifier, the addReturnTypeVariables
helper family, the new SkipProxy / excludeMethodNames filters,
the ProxyEntry note emitter and the ResolvedOptions record
✅ Tests:
- ✅ 15 tests in proxybuilder-annotations covering all annotations
✅ (ProxyEnforcementTest, AnnotationContractTest with retention and
✅ target checks per annotation, ProxyBuilderVersionTest) - ✅ 24 tests in proxybuilder covering the processor wiring
✅ (AnnotationsModuleProcessorTest with 11 cases: runtime introspection
of GeneratedByProxyBuilder, SkipProxy on method and on constructor,
ProxyBuilderOptions suffix / failOnStaticMethods / excludeMethodNames,
✅ DelegatesTo emission and suppression, ProxyName precedence,
✅ ProxyEntry NOTE, migration smoke; existing StaticProxyHardeningTest
✅ 11 cases; CompileTestingWriterLifecycleTest 1 case;
✅ DownstreamSmokeTest 1 case) - ✅ DownstreamSmokeTest verifies the module-split architectural goal:
generated wrapper source has zero imports from
com.svenruppert.proxybuilder.* outside .annotations.*
✅ Mutation testing:
- ✅ wire pitest-maven 1.25.2 into parent pluginManagement with the
JUnit 5 platform compatibility deps that compensate for
✅ pitest-junit5-plugin 1.2.3 not yet supporting JUnit Jupiter 6.x - ✅ each module supplies its own targetClasses and targetTests
✅ (parent's defaults get cross-derived from testusage's junit.*
📦 test package and miss the real tests) - baseline scores: proxybuilder-annotations 100% mutation (3/3) /
78% line coverage; proxybuilder 50% mutation (175/347) / 67% line
✅ coverage / 76% test strength. The 117 NO_COVERAGE mutations live in
the runtime dynamic-proxy / object-adapter classes that currently
✅ have no tests in impl
📚 Documentation:
- ⚡️ update top-level README modules section to introduce
proxybuilder-annotations and the consumer wiring pattern - ⚡️ update Processor Options section with the new
✅ proxybuilder.suppressDelegatesTo option - ➕ add proxybuilder-annotations/README.md with an annotation catalogue
table (target, retention, tier) and notes on ProxyEnforcement
and ProxyBuilderVersion - 🚀 RELEASE_NOTES-00.11.00.md covers the module split, breaking change,
✅ all nine new annotations, processor changes, downstream smoke test,
✅ example test coverage, and the pitest baseline
Verification:
- ./mvnw clean install
- ✅ ./mvnw -pl proxybuilder-annotations test
- ✅ ./mvnw -pl impl test
- ✅ ./mvnw -pl proxybuilder-annotations org.pitest:pitest-maven:mutationCoverage
- ✅ ./mvnw -pl impl org.pitest:pitest-maven:mutationCoverage
- introduce com.svenruppert:proxybuilder-annotations as a tiny
-
v00.10.01 Changes
May 28, 2026🚀 Release Notes
00.10.01 — 2026-05-28
🚀 Patch release on top of
00.10.00. No API changes.🛠 Fixes
BasicAnnotationProcessor.writeDefinedClass: close the generated-source writer socom.google.testing.compile'sInMemoryJavaFileManagerpublishes the written content. The previous code onlyflush()-ed the writer; OpenJDK's realFilertolerates that, butInMemoryJavaFileManageronly makes the file readable once the writer is closed. Downstream projects that exercise proxybuilder processors viacompile-testing0.21.0 saw an unmessagedjava.io.FileNotFoundExceptionfromJavaFileObject.openInputStream()/contentsAsUtf8String(); that path now works.
✅ Tests
- 🆕 New regression test
CompileTestingWriterLifecycleTestrunsStaticLoggingProxyAnnotationProcessorthroughCompiler.javac()and assertscontentsAsUtf8String()on the generated source — the exact call that threw on00.10.00. - ✅
com.google.testing.compile:compile-testing:0.21.0added as atest-scoped dependency on theproxybuildermodule.
-
v00.10.00 Changes
May 27, 2026🚀 Release Notes
00.10.00 — 2026-05-27
🚀 First release under the new
com.svenruppert:proxybuildercoordinates.
🚀 This is a modernization release: new groupId, JDK 26, Maven 4, JPMS, hardened annotation processors, and a Maven-Central-ready release workflow.Coordinates
<dependency> <groupId>com.svenruppert</groupId> <artifactId>proxybuilder</artifactId> <version>00.10.00</version> </dependency>For annotation processing:
<annotationProcessorPaths> <path> <groupId>com.svenruppert</groupId> <artifactId>proxybuilder</artifactId> <version>00.10.00</version> </path> </annotationProcessorPaths>JPMS module name:
com.svenruppert.proxybuilder.💥 Breaking changes
- 🆕 New Maven coordinates. The artifact has moved from the previous
00.09.05-RPMline tocom.svenruppert:proxybuilder:00.10.00. Update all<groupId>/<artifactId>references; the new artifact is not transitively compatible with the old one. - Java baseline raised to JDK 26. The compiler
releasetarget is26; consumers must build on JDK 26 or newer. - Maven 4 required. The build enforces Maven
4.0.0-rc-5via the Maven Wrapper; older Maven versions are not supported. - JPMS module descriptor. The implementation now ships
module-info.java(module com.svenruppert.proxybuilder). Consumers using the module path must require it explicitly; classpath consumers are unaffected. - 🚚 Kotlin sources removed. All Kotlin code paths are gone; the artifact is pure Java again.
- 🚚 JUnit 4 usage removed. Test code runs on JUnit 6 / Jupiter.
- 🚚
javax.annotation-apiremoved fromtestusage. Demo@PostConstructwas replaced with a localdemo.reflections.PostConstruct. slf4j-simpleis no longer a library dependency. Consumers wiring the runtime proxies must supply their own SLF4J binding.- 🚚
reflections8moved out of the main artifact intoproxybuilder-testusagetest scope. - Generated-source marker renamed. Generated classes now carry
@GeneratedByProxyBuilder(previouslyjavax.annotation.Generated-based).
🆕 New features
Annotation-processor hardening. Static-proxy processors now fail compilation for unsafe method shapes with clear
Messagerdiagnostics:Method-level decorator hooks. Custom processors can now contribute code blocks per method via:
Annotation lookup helpers on
BasicAnnotationProcessor:Generated-class-suffix hook. Override
generatedClassSuffix(TypeElement)or set-Aproxybuilder.suffix=<Name>to control the generated type's simple name.Constructor-modifier hook. Override
filterConstructorModifiers(Set<Modifier>)to adjust generated constructor visibility.🏗
addStaticImports(JavaFile.Builder)is now a default no-op — implement it only when generated sources need static imports.🖨 Processor options.
@SupportedOptionsdeclaresproxybuilder.verbose,proxybuilder.suffix,proxybuilder.failOnStaticMethods.MethodIdentifieris a record with defensive copies; the same applies to the reflection-based variant used by the object adapter.
👌 Improvements
- JavaPoet 1.13.0 (was a much older release).
- Records,
var, and modern Java syntax used in the processor codebase where it improves readability. - Generic return-type handling in the static processors is refactored into focused helper methods (behavior preserved).
FilerExceptionis handled explicitly instead of by matching exception messages, making incremental rounds robust.- License headers deduplicated. Single EUPL-1.2 header per file across the project.
- README rewritten as a developer reference covering runtime proxies, static-proxy annotations, custom-processor authoring, decorators, JPMS, processor options, annotation inheritance, and incremental compilation.
🏗 Build & toolchain
- ⬆️ Maven parent
com.svenruppert:dependenciesupgraded to06.02.01, which fixes a duplicateattach-sources/jar-no-forkexecution that surfaced when_release_preparewas active alongside the project'sreleaseprofile. - 🔌
maven-compiler-pluginraised to 3.15.0 for JDK 26 / class-file version 70 support (3.13.0's bundled ASM only reads up to v68 and broke during deploy-phase module-path inspection). - Maven Wrapper pinned to Maven 4.0.0-rc-5 via
requireMavenVersion. - 🚀
releaseprofile attaches sources, javadoc, and GPG-signed artefacts; the parent's_release_prepareprofile contributes thejar-no-fork/test-jar-no-forkvariants. - JPMS validated with
jdeps --check com.svenruppert.proxybuilderas part of the development checks. - ✅ Tests: JDK-compiler-based processor hardening tests (positive + negative) cover logging, metrics, virtual proxy, static object adapter, dynamic object adapter, suffix option, and method-level decorator composition.
Maven Central — current limitation
🚀
central-publishing-maven-plugin0.10.0 (current latest at the time of release) is not Maven-4-aware:- 🏗 It emits the Maven 4 consumer POM as a
*-consumer.pomclassifier and uploads the build POM as the primary.pom, which Central Portal's validator rejects withFailed to associate file with coordinates …. - 🌲 It has no stage-only mode:
skipPublishing=trueskips staging entirely (No files to stage for artifactin the log).
↪ Workaround (used to publish 00.10.00):
./mvnw clean install -P release,_release_prepare ./scripts/clean-bundle-for-central.sh# Upload target/central-publishing/central-bundle.zip via# https://central.sonatype.com/publishing → Publish ComponentThe script reads
~/.m2/repository/com/svenruppert/<module>/<version>/(Maven 4's local installer already names the consumer POM correctly as<artifact>-<version>.pomand keeps the build POM under-build.pom), drops the non-publishable files, generates the four checksum types Central expects, and zips a bundle for manual upload. See the Releasing section of the README for the full release flow.📇 Central Portal also validates each artifact's POM directly and does not resolve
<parent>for required metadata, soimpl/pom.xmlnow carries<name>,<description>, and<url>inline.Known limitations & non-goals
- ✅
proxybuilder-testusageintentionally keeps a smallmaven-antrun-pluginstep that compiles annotation-generated sources before test compilation; removing it currently breakstestCompilebecause some tests reference generated classes directly. The module is excluded from Central publishing. - 📇 Gradle incremental annotation-processing metadata is not published. Maven incremental compilation is verified.
- No GitHub Actions workflow is part of this release.
- 🌲
HasLogger(fromcom.svenruppert:core) remains the logging seam —Messageris used only for compiler diagnostics, not for general logging.
🚀 Project decisions carried into this release
- External parent
com.svenruppert:dependenciesstays. com.svenruppert:corestays incompilescope (required forHasLogger).- 👍
metrics-jmxstays as an intentional dependency because JMX/console reporting is part of the metrics support. slf4j-simpleis not provided as a transitive dependency.- ✅
reflections8is only a test dependency inproxybuilder-testusage.
- 🆕 New Maven coordinates. The artifact has moved from the previous
-
v00.09.05-RPM
July 06, 2019 -
v0.6.0
November 11, 2016 -
v0.0.1
May 12, 2015