00.10.00
Release Notes
00.10.00 — 2026-05-27
First release under the new com.svenruppert:proxybuilder coordinates.
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:finalclasses annotated for proxy generation.final,private, andstaticmethods on proxied types.staticfailure can be downgraded to a warning with-Aproxybuilder.failOnStaticMethods=false.Objectmethods (equals,hashCode,toString,finalize,wait,notify,getClass) are never generated.
-
Method-level decorator hooks. Custom processors can now contribute code blocks per method via:
beforeDelegation(...)aroundDelegation(...)afterDelegation(...)
This enables combining several method-level annotations on the same method (e.g.
@RequiresPolicy+@RequiresPermission+@RequiresRole) without forking the processor. -
Annotation lookup helpers on
BasicAnnotationProcessor:annotationsOn(ExecutableElement)annotationsOn(ExecutableElement, Set<String>)hasAnnotation(ExecutableElement, String)
-
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-plugin 0.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>.pom and 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, so impl/pom.xml now 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.