diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java index a93901cf413e..0b243890827d 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java @@ -1328,6 +1328,12 @@ public enum ReportingMode { @Option(help = "file:doc-files/PreserveHelp.txt")// public static final HostedOptionKey Preserve = new HostedOptionKey<>(AccumulatingLocatableMultiOptionValue.Strings.build()); + @Option(help = "file:doc-files/PreserveHelp.txt")// + public static final HostedOptionKey IgnorePreserveForClasses = new HostedOptionKey<>(AccumulatingLocatableMultiOptionValue.Strings.build()); + + @Option(help = "file:doc-files/PreserveHelp.txt")// + public static final HostedOptionKey IgnorePreserveForClassesPaths = new HostedOptionKey<>(AccumulatingLocatableMultiOptionValue.Strings.build()); + @Option(help = "Force include include all public types and methods that can be reached using normal Java access rules.")// public static final HostedOptionKey UseBaseLayerInclusionPolicy = new HostedOptionKey<>(false); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java index 1fdd59266cc8..667ce455e462 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java @@ -1096,8 +1096,11 @@ protected void setupNativeImage(String imageName, OptionValues options, Map bb.registerTypeForBaseImage(cls)); var runtimeReflection = ImageSingletons.lookup(RuntimeReflectionSupport.class); + + var classesToIgnore = OptionClassFilterBuilder.createFilter(loader, SubstrateOptions.IgnorePreserveForClasses, SubstrateOptions.IgnorePreserveForClassesPaths); loader.classLoaderSupport.getClassesToPreserve().parallel() .filter(ClassInclusionPolicy::isClassIncludedBase) + .filter(c -> classesToIgnore.isIncluded(c) == null) .forEach(c -> runtimeReflection.registerClassFully(ConfigurationCondition.alwaysTrue(), c)); for (String className : loader.classLoaderSupport.getClassNamesToPreserve()) { RuntimeReflection.registerClassLookup(className);