All Versions
7
Latest Version
Avg Release Cycle
672 days
Latest Release
14 days ago

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 new proxybuilder-annotations module 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 in RELEASE_NOTES-00.11.00.md.

    What was broken in 00.11.00

    🚀 The release flow uses scripts/clean-bundle-for-central.sh because
    👀 central-publishing-maven-plugin 0.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 hardcoded MODULES array — and that array was not
    ⚡️ updated when 00.11.00 introduced the new proxybuilder-annotations
    module.

    Consequence: central-bundle.zip shipped to the Central Portal
    contained only proxybuilder-parent and proxybuilder. Anyone
    ➕ adding com.svenruppert:proxybuilder-annotations:00.11.00 to their
    🏗 build got an unresolved dependency.

    🛠 Fixes

    • scripts/clean-bundle-for-central.sh : MODULES now 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: 0
    

    Coordinates

    <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.md collects 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 transitive the 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
  • 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 so com.google.testing.compile's InMemoryJavaFileManager publishes the written content. The previous code only flush()-ed the writer; OpenJDK's real Filer tolerates that, but InMemoryJavaFileManager only makes the file readable once the writer is closed. Downstream projects that exercise proxybuilder processors via compile-testing 0.21.0 saw an unmessaged java.io.FileNotFoundException from JavaFileObject.openInputStream() / contentsAsUtf8String(); that path now works.

    ✅ Tests

    • 🆕 New regression test CompileTestingWriterLifecycleTest runs StaticLoggingProxyAnnotationProcessor through Compiler.javac() and asserts contentsAsUtf8String() on the generated source — the exact call that threw on 00.10.00.
    • com.google.testing.compile:compile-testing:0.21.0 added as a test-scoped dependency on the proxybuilder module.
  • v00.10.00 Changes

    May 27, 2026

    🚀 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-RPM line to com.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 release target is 26; consumers must build on JDK 26 or newer.
    • Maven 4 required. The build enforces Maven 4.0.0-rc-5 via 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-api removed from testusage. Demo @PostConstruct was replaced with a local demo.reflections.PostConstruct.
    • slf4j-simple is no longer a library dependency. Consumers wiring the runtime proxies must supply their own SLF4J binding.
    • 🚚 reflections8 moved out of the main artifact into proxybuilder-testusage test scope.
    • Generated-source marker renamed. Generated classes now carry @GeneratedByProxyBuilder (previously javax.annotation.Generated-based).

    🆕 New features

    • Annotation-processor hardening. Static-proxy processors now fail compilation for unsafe method shapes with clear Messager diagnostics:

    • 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. @SupportedOptions declares proxybuilder.verbose, proxybuilder.suffix, proxybuilder.failOnStaticMethods.

    • MethodIdentifier is 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).
    • FilerException is 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:dependencies upgraded to 06.02.01 , which fixes a duplicate attach-sources/jar-no-fork execution that surfaced when _release_prepare was active alongside the project's release profile.
    • 🔌 maven-compiler-plugin raised 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.
    • 🚀 release profile attaches sources, javadoc, and GPG-signed artefacts; the parent's _release_prepare profile contributes the jar-no-fork/test-jar-no-fork variants.
    • JPMS validated with jdeps --check com.svenruppert.proxybuilder as 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.pom classifier and uploads the build POM as the primary .pom, which Central Portal's validator rejects with Failed to associate file with coordinates ….
    • 🌲 It has no stage-only mode: skipPublishing=true skips staging entirely (No files to stage for artifact in 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 Component
    

    The 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-testusage intentionally keeps a small maven-antrun-plugin step that compiles annotation-generated sources before test compilation; removing it currently breaks testCompile because 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 (from com.svenruppert:core) remains the logging seamMessager is used only for compiler diagnostics, not for general logging.

    🚀 Project decisions carried into this release

    • External parent com.svenruppert:dependencies stays.
    • com.svenruppert:core stays in compile scope (required for HasLogger).
    • 👍 metrics-jmx stays as an intentional dependency because JMX/console reporting is part of the metrics support.
    • slf4j-simple is not provided as a transitive dependency.
    • reflections8 is only a test dependency in proxybuilder-testusage.
  • v00.09.05-RPM

    July 06, 2019
  • v0.6.0

    November 11, 2016
  • v0.0.1

    May 12, 2015