Repository navigation
build(native): migrate GraalVM metadata to reachability-metadata.json - #723
Merged
stefanoboriero merged 3 commits intoOct 19, 2026
Merged
Conversation
… [COMP-2861] CI builds with GraalVM 25, whose native-image-agent emits the unified reachability-metadata.json format instead of the legacy per-category files. Regenerating on the new toolchain therefore left reflect-config.json untouched and master without the new Tower SDK entries. Replace the legacy conf/*-config.json files (proxy, serialization and predefined-classes were empty) with a single reachability-metadata.json: agent output merged with the previous reflection, JNI and resource entries. Point .sdkmanrc at GraalVM 25 to match CI and the Gradle toolchain. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…MP-2861] Jersey 2.48 made JerseyClassAnalyzer public with a (ServiceLocator) constructor that HK2 instantiates reflectively. Without a reflection entry every API call in the native binary logged an HK2 reification failure to stderr, failing 790 binary tests on CI. access-filter-file.json filters by the accessed class and only admitted io.seqera.tower.*, so the tracing agent never recorded Jersey/HK2 reflection and the entry had to be added by hand. Include org.glassfish.jersey.inject.hk2.** so regenerating the metadata captures it automatically, and add the captured entry. Verified against a GraalVM 25 native build: 898 binary tests run, 896 pass; the 2 failures (TaskCmdTest.testTaskDetail*) are a local-locale artifact ($0,000000 vs $0.000000). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
jonmarti
approved these changes
Oct 19, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes master CI (COMP-2861): https://seqera.atlassian.net/browse/COMP-2861
Supersedes #718 (closed): the SDK reflection entries it added by hand are now generated, and its Jersey entry is now captured by the tracing agent.
Root cause
Master's native binary tests (Linux, MAC, MAC-arm64, Windows) failed with 790 of 898 tests red. Two things were wrong:
.sdkmanrcstill pinned GraalVM 21. Regenerating on Java 21 produced no changes (the task was also cached by Gradle, socleanis needed to force it). The GraalVM 25native-image-agentwrites the unifiedreachability-metadata.jsoninstead of the legacyreflect-config.json/resource-config.json, so the new Tower SDK entries never reached the legacy files.JerseyClassAnalyzerpublic with a(ServiceLocator)constructor that HK2 instantiates reflectively. With no reflection entry, every API call in the native binary loggedHK2 service reification failed for [...JerseyClassAnalyzer]to stderr, failing the tests that assert empty stderr. The tracing agent could not capture it becauseconf/access-filter-file.jsonfilters by the accessed class and only admittedio.seqera.tower.*.Changes
conf/{reflect,resource,jni,proxy,serialization,predefined-classes}-config.jsonwith a singleconf/reachability-metadata.json. The proxy, serialization and predefined-classes files were empty.test -Dtracing-agent=true) merged with the previous reflection, JNI and resource entries. There is no legacy-to-unified converter, so the merge was a one-off script. Agent output alone had 1079 reflection types and missed the CLI's own classes and Jersey.access-filter-file.json: includeorg.glassfish.jersey.inject.hk2.**so theJerseyClassAnalyzerentry is recorded by the agent instead of added by hand..sdkmanrcnow targets GraalVM 25 (25.4.4+1-graal), matching CI.build.gradle: log full stack traces of failing tests.ReflectionConfigGeneratorjavadoc updated.Notes
conf/first, becauseconfig-merge-dironly merges into what is already there.Testing
TOWER_CLI=build/native/nativeCompile/tw ./gradlew cleanTest test): 898 tests, 896 pass. The 2 failures (TaskCmdTest.testTaskDetail*) are a local locale artifact ($0,000000vs$0.000000), the same as reported in build(native): fix native binary tests after Jersey 2.48 and SDK 1.236.0 bumps #718.InfoCmdTestrun with the new access-filter rule capturesJerseyClassAnalyzerwith no manual entry and no other changes.🤖 Generated with Claude Code