From d1ff28e5e9f5e3bbceaadd71adaddb84b6c290ea Mon Sep 17 00:00:00 2001 From: Niels Pardon Date: Wed, 1 Jul 2026 18:23:17 +0200 Subject: [PATCH] fix(isthmus): use reachability-metadata.json for native image build The native image build passed GraalVM options that are now deprecated and emitted build warnings (issue #531): - -H:IncludeResources (resource inclusion) - -H:DynamicProxyConfigurationFiles (dynamic proxy config, via proxies.json) Both are replaced by a single declarative reachability-metadata.json on the classpath under META-INF/native-image/io.substrait/isthmus-cli/, which is the approach GraalVM now expects. Also: - Drop --report-unsupported-elements-at-runtime, itself deprecated and now a no-op (unsupported elements are always reported at run time). - Strip picocli-codegen's empty ([]) proxy-config.json after compile; its mere presence triggered the deprecated DynamicProxyConfigurationResources warning. reflect-config.json / resource-config.json (the real picocli metadata) are left intact. Verified with a native build (Oracle GraalVM 25.0.2): the build no longer emits any of these deprecation warnings, and smoke.sh / tpch_smoke.sh pass against the produced binary. --- isthmus-cli/build.gradle.kts | 20 +- isthmus-cli/proxies.json | 30 --- .../isthmus-cli/reachability-metadata.json | 206 ++++++++++++++++++ 3 files changed, 222 insertions(+), 34 deletions(-) delete mode 100644 isthmus-cli/proxies.json create mode 100644 isthmus-cli/src/main/resources/META-INF/native-image/io.substrait/isthmus-cli/reachability-metadata.json diff --git a/isthmus-cli/build.gradle.kts b/isthmus-cli/build.gradle.kts index 7a3df32ef..ec1af73a7 100644 --- a/isthmus-cli/build.gradle.kts +++ b/isthmus-cli/build.gradle.kts @@ -56,10 +56,9 @@ graalvmNative { named("main") { imageName.set("isthmus") fallback.set(false) - buildArgs.add("-H:IncludeResources=.*yaml") - buildArgs.add("--report-unsupported-elements-at-runtime") + // Resource inclusion and dynamic-proxy configuration are declared in + // src/main/resources/META-INF/native-image/.../reachability-metadata.json. buildArgs.add("-H:+ReportExceptionStackTraces") - buildArgs.add("-H:DynamicProxyConfigurationFiles=${project.file("proxies.json")}") buildArgs.add("--features=io.substrait.isthmus.cli.RegisterAtRuntime") // Removed due to https://github.com/oracle/graal/issues/13316 // buildArgs.add("--future-defaults=all") @@ -98,7 +97,20 @@ tasks.register("writeIsthmusVersion") { } } -tasks.named("compileJava") { dependsOn("writeIsthmusVersion") } +tasks.named("compileJava") { + dependsOn("writeIsthmusVersion") + // picocli-codegen emits an empty (`[]`) proxy-config.json because isthmus uses class-based + // @Command annotations and needs no JDK dynamic proxies. Its mere presence makes GraalVM emit a + // warning, so delete it after compile. reflect-config.json / resource-config.json (the real + // picocli metadata) are left untouched. + doLast { + destinationDirectory + .file("META-INF/native-image/picocli-generated/proxy-config.json") + .get() + .asFile + .delete() + } +} tasks.named("javadoc") { description = "Generate Javadoc for main source files (excludes generated)." diff --git a/isthmus-cli/proxies.json b/isthmus-cli/proxies.json deleted file mode 100644 index 19838d6c4..000000000 --- a/isthmus-cli/proxies.json +++ /dev/null @@ -1,30 +0,0 @@ -[ - ["org.apache.calcite.rel.metadata.BuiltInMetadata$AllPredicates$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$Collation$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnOrigin$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnUniqueness$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$CumulativeCost$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$DistinctRowCount$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$Distribution$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$ExplainVisibility$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$ExpressionLineage$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$FunctionalDependency$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$InputFieldsUsed$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$LowerBoundCost$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$MaxRowCount$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$Measure$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$Memory$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$MinRowCount$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$NodeTypes$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$NonCumulativeCost$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$Parallelism$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$PercentageOriginalRows$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$PopulationSize$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$Predicates$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$RowCount$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$Selectivity$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$Size$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$TableReferences$Handler"], - ["org.apache.calcite.rel.metadata.BuiltInMetadata$UniqueKeys$Handler"], - ["org.apache.calcite.runtime.CalciteResource"] -] diff --git a/isthmus-cli/src/main/resources/META-INF/native-image/io.substrait/isthmus-cli/reachability-metadata.json b/isthmus-cli/src/main/resources/META-INF/native-image/io.substrait/isthmus-cli/reachability-metadata.json new file mode 100644 index 000000000..a73d84903 --- /dev/null +++ b/isthmus-cli/src/main/resources/META-INF/native-image/io.substrait/isthmus-cli/reachability-metadata.json @@ -0,0 +1,206 @@ +{ + "comment": "GraalVM reachability metadata for the isthmus native image.", + "resources": [ + { + "glob": "**/*.yaml" + } + ], + "reflection": [ + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$AllPredicates$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$Collation$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnOrigin$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnUniqueness$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$CumulativeCost$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$DistinctRowCount$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$Distribution$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$ExplainVisibility$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$ExpressionLineage$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$FunctionalDependency$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$InputFieldsUsed$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$LowerBoundCost$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$MaxRowCount$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$Measure$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$Memory$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$MinRowCount$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$NodeTypes$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$NonCumulativeCost$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$Parallelism$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$PercentageOriginalRows$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$PopulationSize$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$Predicates$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$RowCount$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$Selectivity$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$Size$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$TableReferences$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.rel.metadata.BuiltInMetadata$UniqueKeys$Handler" + ] + } + }, + { + "type": { + "proxy": [ + "org.apache.calcite.runtime.CalciteResource" + ] + } + } + ] +}