Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveMethodBuildItem;
import io.quarkus.deployment.pkg.NativeConfig;
import io.quarkus.deployment.pkg.steps.NativeImageFutureDefault;
import io.quarkus.deployment.util.ReflectUtil;
import io.quarkus.hibernate.validator.spi.AdditionalConstrainedClassBuildItem;
import io.smallrye.config.ConfigMapping;
Expand All @@ -47,6 +49,7 @@ private ConfigMappingUtils() {

// Used for application Mappings and MP ConfigProperties
public static void processConfigClasses(
NativeConfig nativeConfig,
ConfigurationBuildItem configItem,
CombinedIndexBuildItem combinedIndex,
Map<String, GeneratedClassBuildItem> generatedConfigClasses,
Expand Down Expand Up @@ -75,24 +78,28 @@ public static void processConfigClasses(
continue;
}
Kind configClassKind = getConfigClassType(instance);
processConfigClass(configClass, configClassKind, combinedIndex, generatedConfigClasses, reflectiveClasses,
processConfigClass(nativeConfig, configClass, configClassKind, combinedIndex, generatedConfigClasses,
reflectiveClasses,
reflectiveMethods, configClasses, additionalConstrainedClasses);
}
}

public static void processConfigMapping(
NativeConfig nativeConfig,
ConfigurationBuildItem configItem,
CombinedIndexBuildItem combinedIndex,
Map<String, GeneratedClassBuildItem> generatedConfigClasses,
BuildProducer<ReflectiveClassBuildItem> reflectiveClasses,
BuildProducer<ReflectiveMethodBuildItem> reflectiveMethods,
BuildProducer<ConfigClassBuildItem> configClasses,
BuildProducer<AdditionalConstrainedClassBuildItem> additionalConstrainedClasses) {
processConfigClasses(configItem, combinedIndex, generatedConfigClasses, reflectiveClasses, reflectiveMethods,
processConfigClasses(nativeConfig, configItem, combinedIndex, generatedConfigClasses, reflectiveClasses,
reflectiveMethods,
configClasses, additionalConstrainedClasses, CONFIG_MAPPING_NAME);
}

public static void processExtensionConfigMapping(
NativeConfig nativeConfig,
ConfigClass configClass,
CombinedIndexBuildItem combinedIndex,
Map<String, GeneratedClassBuildItem> generatedConfigClasses,
Expand All @@ -101,11 +108,12 @@ public static void processExtensionConfigMapping(
BuildProducer<ConfigClassBuildItem> configClasses,
BuildProducer<AdditionalConstrainedClassBuildItem> additionalConstrainedClasses) {

processConfigClass(configClass, Kind.MAPPING, combinedIndex, generatedConfigClasses, reflectiveClasses,
processConfigClass(nativeConfig, configClass, Kind.MAPPING, combinedIndex, generatedConfigClasses, reflectiveClasses,
reflectiveMethods, configClasses, additionalConstrainedClasses);
}

private static void processConfigClass(
NativeConfig nativeConfig,
ConfigClass configClassWithPrefix,
Kind configClassKind,
CombinedIndexBuildItem combinedIndex,
Expand All @@ -131,7 +139,11 @@ private static void processConfigClass(
classBytes));
additionalConstrainedClasses.produce(AdditionalConstrainedClassBuildItem.of(mappingMetadata.getClassName(),
classBytes));
reflectiveClasses.produce(ReflectiveClassBuildItem.builder(mappingMetadata.getClassName())
ReflectiveClassBuildItem.Builder reflection = ReflectiveClassBuildItem.builder(mappingMetadata.getClassName());
if (NativeImageFutureDefault.COMPLETE_REFLECTION_TYPES.isEnabled(nativeConfig)) {
reflection.methods();
}
reflectiveClasses.produce(reflection
.reason(ConfigMappingUtils.class.getName())
.build());
reflectiveMethods.produce(new ReflectiveMethodBuildItem(ConfigMappingUtils.class.getName(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import io.quarkus.deployment.builditem.GeneratedFileSystemResourceBuildItem;
import io.quarkus.deployment.builditem.GeneratedFileSystemResourceHandledBuildItem;
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedPackageBuildItem;
import io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem;
import io.quarkus.deployment.pkg.builditem.OutputTargetBuildItem;
import io.quarkus.runtime.LaunchMode;
Expand All @@ -30,6 +32,16 @@ public void notNormalMode(OutputTargetBuildItem outputTargetBuildItem,
producer.produce(new GeneratedFileSystemResourceHandledBuildItem());
}

@BuildStep(onlyIf = NativeImageFutureDefault.RunTimeInitializeFileSystemProvider.class)
RuntimeInitializedPackageBuildItem runtimeInitialized() {
return new RuntimeInitializedPackageBuildItem("io.quarkus.fs.util");
}

@BuildStep(onlyIf = NativeImageFutureDefault.RunTimeInitializeFileSystemProvider.class)
ReflectiveClassBuildItem setupReflectionClasses() {
return ReflectiveClassBuildItem.builder("jdk.nio.zipfs.ZipFileSystemProvider").build();
}

@BuildStep(onlyIf = IsProduction.class)
public void normalMode(OutputTargetBuildItem outputTargetBuildItem,
List<GeneratedFileSystemResourceBuildItem> generatedFileSystemResources,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import io.quarkus.deployment.builditem.nativeimage.NativeImageSecurityProviderBuildItem;
import io.quarkus.deployment.builditem.nativeimage.NativeImageSystemPropertyBuildItem;
import io.quarkus.deployment.builditem.nativeimage.NativeMinimalJavaVersionBuildItem;
import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedPackageBuildItem;
import io.quarkus.deployment.builditem.nativeimage.UnsupportedOSBuildItem;
import io.quarkus.deployment.pkg.NativeConfig;
import io.quarkus.deployment.pkg.PackageConfig;
Expand Down Expand Up @@ -187,6 +188,11 @@ ArtifactResultBuildItem nativeSourcesResult(NativeConfig nativeConfig,
.build());
}

@BuildStep(onlyIf = NativeImageFutureDefault.RunTimeInitializeFileSystemProvider.class)
RuntimeInitializedPackageBuildItem runtimeInitialized() {
return new RuntimeInitializedPackageBuildItem("io.smallrye.common.classloader");
}

@BuildStep
public NativeImageBuildItem build(NativeConfig nativeConfig, LocalesBuildTimeConfig localesBuildTimeConfig,
NativeImageSourceJarBuildItem nativeImageSourceJarBuildItem,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package io.quarkus.deployment.pkg.steps;

import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.function.BooleanSupplier;

import io.quarkus.deployment.pkg.NativeConfig;

public enum NativeImageFutureDefault {
COMPLETE_REFLECTION_TYPES,
RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS,
RUN_TIME_INITIALIZE_SECURITY_PROVIDERS;

private static final String FUTURE_DEFAULTS_MARKER = "--future-defaults=";

public boolean isEnabled(NativeConfig nativeConfig) {
return isFutureDefault(this, nativeConfig);
}

private static boolean isFutureDefault(NativeImageFutureDefault futureDefault, NativeConfig nativeConfig) {
Optional<List<String>>[] additionalBuildArgs = new Optional[] { nativeConfig.additionalBuildArgs(),
nativeConfig.additionalBuildArgsAppend() };

for (Optional<List<String>> args : additionalBuildArgs) {
if (args.isEmpty()) {
continue;
}
List<String> strings = args.get();
for (String buildArg : strings) {
String trimmedBuildArg = buildArg.trim();
if (trimmedBuildArg.contains(FUTURE_DEFAULTS_MARKER)) {
int index = trimmedBuildArg.indexOf('=');
String[] futureDefaultStringArgs = trimmedBuildArg.substring(index + 1).split(",");
for (String futureDefaultString : futureDefaultStringArgs) {
if ("all".equals(futureDefaultString)) {
return true;
}

if ("run-time-initialize-jdk".equals(futureDefaultString)) {
switch (futureDefault) {
case RUN_TIME_INITIALIZE_SECURITY_PROVIDERS:
case RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS:
return true;
}
}

final NativeImageFutureDefault futureDefaultArg = NativeImageFutureDefault
.valueOf(futureDefaultString.toUpperCase(Locale.ROOT).replace('-', '_'));
if (futureDefaultArg == futureDefault) {
return true;
}
}
}
}
}

return false;
}

private static abstract class AbstractNativeImageFutureDefaultBooleanSupplier implements BooleanSupplier {
protected final NativeConfig nativeConfig;

public AbstractNativeImageFutureDefaultBooleanSupplier(final NativeConfig nativeConfig) {
this.nativeConfig = nativeConfig;
}
}

public static final class RunTimeInitializeFileSystemProvider extends AbstractNativeImageFutureDefaultBooleanSupplier {
public RunTimeInitializeFileSystemProvider(NativeConfig nativeConfig) {
super(nativeConfig);
}

@Override
public boolean getAsBoolean() {
return isFutureDefault(NativeImageFutureDefault.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS, nativeConfig);
}
}

public static final class RunTimeInitializeSecurityProvider extends AbstractNativeImageFutureDefaultBooleanSupplier {
public RunTimeInitializeSecurityProvider(NativeConfig nativeConfig) {
super(nativeConfig);
}

@Override
public boolean getAsBoolean() {
return isFutureDefault(NativeImageFutureDefault.RUN_TIME_INITIALIZE_SECURITY_PROVIDERS, nativeConfig);
}
}

public static final class CompleteReflectionTypes extends AbstractNativeImageFutureDefaultBooleanSupplier {
public CompleteReflectionTypes(NativeConfig nativeConfig) {
super(nativeConfig);
}

@Override
public boolean getAsBoolean() {
return isFutureDefault(NativeImageFutureDefault.COMPLETE_REFLECTION_TYPES, nativeConfig);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
import io.quarkus.deployment.configuration.RunTimeConfigurationGenerator;
import io.quarkus.deployment.configuration.tracker.ConfigTrackingConfig;
import io.quarkus.deployment.configuration.tracker.ConfigTrackingWriter;
import io.quarkus.deployment.pkg.NativeConfig;
import io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem;
import io.quarkus.deployment.pkg.builditem.BuildSystemTargetBuildItem;
import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
Expand Down Expand Up @@ -197,6 +198,7 @@ void runtimeOverrideConfig(

@BuildStep
void generateMappings(
NativeConfig nativeConfig,
ConfigurationBuildItem configItem,
CombinedIndexBuildItem combinedIndex,
BuildProducer<GeneratedClassBuildItem> generatedClasses,
Expand All @@ -207,18 +209,21 @@ void generateMappings(

Map<String, GeneratedClassBuildItem> generatedConfigClasses = new HashMap<>();

processConfigMapping(configItem, combinedIndex, generatedConfigClasses, reflectiveClasses, reflectiveMethods,
processConfigMapping(nativeConfig, configItem, combinedIndex, generatedConfigClasses, reflectiveClasses,
reflectiveMethods,
configClasses, additionalConstrainedClasses);

List<ConfigClass> buildTimeRunTimeMappings = configItem.getReadResult().getBuildTimeRunTimeMappings();
for (ConfigClass buildTimeRunTimeMapping : buildTimeRunTimeMappings) {
processExtensionConfigMapping(buildTimeRunTimeMapping, combinedIndex, generatedConfigClasses, reflectiveClasses,
processExtensionConfigMapping(nativeConfig, buildTimeRunTimeMapping, combinedIndex, generatedConfigClasses,
reflectiveClasses,
reflectiveMethods, configClasses, additionalConstrainedClasses);
}

List<ConfigClass> runTimeMappings = configItem.getReadResult().getRunTimeMappings();
for (ConfigClass runTimeMapping : runTimeMappings) {
processExtensionConfigMapping(runTimeMapping, combinedIndex, generatedConfigClasses, reflectiveClasses,
processExtensionConfigMapping(nativeConfig, runTimeMapping, combinedIndex, generatedConfigClasses,
reflectiveClasses,
reflectiveMethods,
configClasses, additionalConstrainedClasses);
}
Expand Down
Loading
Loading