Skip to content

Warn when using deprecated configurations #48660

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 1, 2025
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 @@ -42,10 +42,6 @@
import org.jboss.logging.Logger;

import io.quarkus.deployment.configuration.definition.ClassDefinition;
import io.quarkus.deployment.configuration.definition.ClassDefinition.ClassMember;
import io.quarkus.deployment.configuration.definition.ClassDefinition.GroupMember;
import io.quarkus.deployment.configuration.definition.ClassDefinition.ItemMember;
import io.quarkus.deployment.configuration.definition.ClassDefinition.MapMember;
import io.quarkus.deployment.configuration.definition.GroupDefinition;
import io.quarkus.deployment.configuration.definition.RootDefinition;
import io.quarkus.deployment.configuration.matching.ConfigPatternMap;
Expand Down Expand Up @@ -130,9 +126,6 @@ private static List<Class<?>> collectConfigRoots(ClassLoader classLoader) throws
final List<ConfigClass> buildTimeVisibleMappings;
final Set<String> mappingsIgnorePaths;

final Set<String> deprecatedProperties;
final Set<String> deprecatedRuntimeProperties;

final ConfigTrackingInterceptor buildConfigTracker;

/**
Expand Down Expand Up @@ -279,9 +272,6 @@ private BuildTimeConfigurationReader(ClassLoader classLoader, final List<Class<?
}
}

deprecatedProperties = getDeprecatedProperties(allRoots);
deprecatedRuntimeProperties = getDeprecatedProperties(runTimeRoots);

buildConfigTracker = new ConfigTrackingInterceptor();
}

Expand Down Expand Up @@ -460,57 +450,6 @@ public ReadResult readConfiguration(final SmallRyeConfig config) {
return SecretKeys.doUnlocked(() -> new ReadOperation(config, buildConfigTracker).run());
}

private Set<String> getDeprecatedProperties(Iterable<RootDefinition> rootDefinitions) {
Set<String> ret = new HashSet<>();
StringBuilder nameBuilder = new StringBuilder();
for (RootDefinition rootDefinition : rootDefinitions) {
int len = nameBuilder.length();
try {
nameBuilder.append(rootDefinition.getName());
collectDeprecatedConfigItems(rootDefinition, ret, nameBuilder);
} finally {
nameBuilder.setLength(len);
}
}
return Set.copyOf(ret);
}

private void collectDeprecatedConfigItems(ClassDefinition classDefinition, Set<String> deprecatedConfigItems,
StringBuilder nameBuilder) {
for (ClassMember m : classDefinition.getMembers()) {
collectDeprecatedConfigItems(m, deprecatedConfigItems, nameBuilder);
}
}

private void collectDeprecatedConfigItems(ClassMember classMember, Set<String> deprecatedConfigItems,
StringBuilder nameBuilder) {
if (classMember instanceof ItemMember) {
ItemMember im = (ItemMember) classMember;
if (im.getField().isAnnotationPresent(Deprecated.class)) {
int len = nameBuilder.length();
try {
nameBuilder.append(".").append(im.getPropertyName());
deprecatedConfigItems.add(nameBuilder.toString());
} finally {
nameBuilder.setLength(len);
}
}
} else if (classMember instanceof GroupMember) {
GroupMember gm = (GroupMember) classMember;
int len = nameBuilder.length();
try {
nameBuilder.append(".").append(gm.getPropertyName());
collectDeprecatedConfigItems(gm.getGroupDefinition(), deprecatedConfigItems, nameBuilder);
} finally {
nameBuilder.setLength(len);
}

} else if (classMember instanceof MapMember) {
MapMember mm = (MapMember) classMember;
collectDeprecatedConfigItems(mm.getNested(), deprecatedConfigItems, nameBuilder);
}
}

final class ReadOperation {
final SmallRyeConfig config;
final ConfigTrackingInterceptor buildConfigTracker;
Expand Down Expand Up @@ -568,9 +507,6 @@ ReadResult run() {
if (propertyName.equals(ConfigSource.CONFIG_ORDINAL)) {
continue;
}
if (deprecatedProperties.contains(propertyName)) {
log.warnf("The '%s' config property is deprecated and should not be used anymore", propertyName);
}

NameIterator ni = new NameIterator(propertyName);
if (ni.hasNext() && PropertiesUtil.isPropertyInRoots(propertyName, registeredRoots)) {
Expand Down Expand Up @@ -753,7 +689,6 @@ public void accept(final ConfigSource buildSystem) {
.setRunTimeMappings(runTimeMappings)
.setMappingsIgnorePaths(mappingsIgnorePaths)
.setUnknownBuildProperties(unknownBuildProperties)
.setDeprecatedRuntimeProperties(deprecatedRuntimeProperties)
.setBuildConfigTracker(buildConfigTracker)
.createReadResult();
}
Expand Down Expand Up @@ -1350,7 +1285,6 @@ public static final class ReadResult {
final Map<Class<?>, ConfigClass> allMappingsByClass;

final Set<String> unknownBuildProperties;
final Set<String> deprecatedRuntimeProperties;
final ConfigTrackingInterceptor.ReadOptionsProvider readOptionsProvider;

public ReadResult(final Builder builder) {
Expand All @@ -1376,7 +1310,6 @@ public ReadResult(final Builder builder) {
this.allMappingsByClass = mappingsToMap(builder);

this.unknownBuildProperties = builder.getUnknownBuildProperties();
this.deprecatedRuntimeProperties = builder.deprecatedRuntimeProperties;
this.readOptionsProvider = builder.buildConfigTracker == null ? null
: builder.buildConfigTracker.getReadOptionsProvider();
}
Expand Down Expand Up @@ -1471,10 +1404,6 @@ public Set<String> getUnknownBuildProperties() {
return unknownBuildProperties;
}

public Set<String> getDeprecatedRuntimeProperties() {
return deprecatedRuntimeProperties;
}

public Object requireObjectForClass(Class<?> clazz) {
Object obj = objectsByClass.get(clazz);
if (obj == null) {
Expand Down Expand Up @@ -1502,7 +1431,6 @@ static class Builder {
private List<ConfigClass> runTimeMappings;
private Set<String> mappingsIgnorePaths;
private Set<String> unknownBuildProperties;
private Set<String> deprecatedRuntimeProperties;
private ConfigTrackingInterceptor buildConfigTracker;

Map<Class<?>, Object> getObjectsByClass() {
Expand Down Expand Up @@ -1631,11 +1559,6 @@ Builder setUnknownBuildProperties(final Set<String> unknownBuildProperties) {
return this;
}

Builder setDeprecatedRuntimeProperties(Set<String> deprecatedRuntimeProperties) {
this.deprecatedRuntimeProperties = deprecatedRuntimeProperties;
return this;
}

Builder setBuildConfigTracker(ConfigTrackingInterceptor buildConfigTracker) {
this.buildConfigTracker = buildConfigTracker;
return this;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.quarkus.deployment.steps;

import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT;
import static io.quarkus.deployment.configuration.ConfigMappingUtils.processConfigMapping;
import static io.quarkus.deployment.configuration.ConfigMappingUtils.processExtensionConfigMapping;
import static io.quarkus.deployment.configuration.RunTimeConfigurationGenerator.CONFIG_RUNTIME_NAME;
Expand Down Expand Up @@ -99,6 +100,8 @@
import io.quarkus.runtime.configuration.RuntimeOverrideConfigSource;
import io.quarkus.runtime.configuration.RuntimeOverrideConfigSourceBuilder;
import io.quarkus.runtime.configuration.StaticInitConfigBuilder;
import io.smallrye.config.ConfigMappingInterface;
import io.smallrye.config.ConfigMappings;
import io.smallrye.config.ConfigMappings.ConfigClass;
import io.smallrye.config.ConfigSourceFactory;
import io.smallrye.config.ConfigSourceInterceptor;
Expand Down Expand Up @@ -485,6 +488,37 @@ public void watchConfigFiles(BuildProducer<HotDeploymentWatchedFileBuildItem> wa
}
}

@BuildStep
@Record(RUNTIME_INIT)
void reportDeprecatedMappingProperties(ConfigRecorder configRecorder, ConfigurationBuildItem configBuildItem) {
// Build Time
List<ConfigClass> visibleBuildTimeMappings = new ArrayList<>();
visibleBuildTimeMappings.addAll(configBuildItem.getReadResult().getBuildTimeMappings());
visibleBuildTimeMappings.addAll(configBuildItem.getReadResult().getBuildTimeRunTimeMappings());
Map<String, String> deprecatedProperties = deprecatedProperties(visibleBuildTimeMappings);
ConfigDiagnostic.deprecatedProperties(deprecatedProperties);

// Runtime
Map<String, String> runtimeDeprecatedProperties = deprecatedProperties(
configBuildItem.getReadResult().getRunTimeMappings());
configRecorder.deprecatedProperties(runtimeDeprecatedProperties);
}

private static Map<String, String> deprecatedProperties(List<ConfigClass> configClasses) {
Map<String, String> deprecatedProperties = new HashMap<>();
for (ConfigClass buildTimeMapping : configClasses) {
Map<String, ConfigMappingInterface.Property> properties = ConfigMappings.getProperties(buildTimeMapping);
for (Map.Entry<String, ConfigMappingInterface.Property> entry : properties.entrySet()) {
Deprecated deprecated = entry.getValue().getMethod().getAnnotation(Deprecated.class);
if (deprecated != null) {
// TODO - add javadoc message
deprecatedProperties.put(entry.getKey(), null);
}
}
}
return deprecatedProperties;
}

@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
void unknownConfigFiles(
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.Set;
Expand All @@ -26,6 +27,7 @@

import io.quarkus.runtime.ImageMode;
import io.smallrye.config.ConfigValue;
import io.smallrye.config.DefaultValuesConfigSource;
import io.smallrye.config.SmallRyeConfig;
import io.smallrye.config.common.utils.StringUtil;

Expand Down Expand Up @@ -63,8 +65,24 @@ public static void duplicate(String name) {
errorKeys.add(name);
}

public static void deprecated(String name) {
log.warnf("Configuration key \"%s\" is deprecated", name);
public static void deprecatedProperties(Map<String, String> deprecatedProperties) {
SmallRyeConfig config = ConfigProvider.getConfig().unwrap(SmallRyeConfig.class);
for (Map.Entry<String, String> entry : deprecatedProperties.entrySet()) {
String propertyName = entry.getKey();
ConfigValue configValue = config.getConfigValue(propertyName);
if (configValue.getValue() != null && !DefaultValuesConfigSource.NAME.equals(configValue.getConfigSourceName())) {
ConfigDiagnostic.deprecated(propertyName, entry.getValue());
}
}
}

public static void deprecated(String name, String javadoc) {
if (javadoc != null) {
log.warnf("The \"%s\" config property is deprecated and should not be used anymore. Deprecated message: %s", name,
javadoc);
} else {
log.warnf("The \"%s\" config property is deprecated and should not be used anymore.", name);
}
}

public static void unknown(String name) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ public void handleNativeProfileChange(List<String> buildProfiles) {
}
}

public void deprecatedProperties(Map<String, String> deprecatedProperties) {
ConfigDiagnostic.deprecatedProperties(deprecatedProperties);
}

public void unknownConfigFiles() throws Exception {
ConfigDiagnostic.unknownConfigFiles(ConfigDiagnostic.configFilesFromLocations());
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package io.quarkus.config;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.LogRecord;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.test.QuarkusUnitTest;

public class DeprecatedPropertiesTest {
@RegisterExtension
static final QuarkusUnitTest TEST = new QuarkusUnitTest()
.setLogRecordPredicate(record -> record.getLevel().intValue() >= Level.WARNING.intValue())
.assertLogRecords(logRecords -> {
List<LogRecord> deprecatedProperties = logRecords.stream()
.filter(l -> l.getMessage().contains("config property is deprecated"))
.toList();

assertEquals(2, deprecatedProperties.size());
assertTrue(deprecatedProperties.get(0).getParameters()[0].toString().contains("quarkus.mapping.bt.deprecated"));
assertTrue(deprecatedProperties.get(1).getParameters()[0].toString().contains("quarkus.mapping.rt.deprecated"));
});

@Test
void deprecatedProperties() {

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@ public interface TestMappingBuildTime {
*/
Optional<List<Group>> optionalGroups();

/**
* Deprecated
*
* @deprecated deprecated.
*/
@Deprecated
String deprecated();

interface Group {
/**
* A Group value.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@ public interface TestMappingRunTime {
@WithDefault("${quarkus.mapping.rt.expression.value}")
Optional<String> expression();

/**
* Deprecated
*
* @deprecated deprecated.
*/
@Deprecated
String deprecated();

interface Group {
/**
* A Group value.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
ignore.build-time.config.build-time=value
ignore.build-time.config.runtime=value
ignore.build-time.config.runtime=value

quarkus.mapping.bt.deprecated=deprecated
quarkus.mapping.rt.deprecated=deprecated
Loading