Skip to content

Commit b46341a

Browse files
committed
Gradle plugin "confused" with parent-first vs removed vs optional artifacts
The Gradle plugin accidentally removed all parent-first artifacts. The implementation mixed up optional vs removed vs parent-first artifacts. This changes fixes this behavior. Fixes #33870
1 parent 0db1710 commit b46341a

File tree

1 file changed

+30
-16
lines changed

1 file changed

+30
-16
lines changed

devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusBuildDependencies.java

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.nio.file.Files;
66
import java.nio.file.Path;
77
import java.util.Arrays;
8+
import java.util.Collections;
89
import java.util.HashMap;
910
import java.util.Map;
1011
import java.util.Set;
@@ -34,6 +35,8 @@
3435
public abstract class QuarkusBuildDependencies extends QuarkusBuildTask {
3536
static final String CLASS_LOADING_REMOVED_ARTIFACTS = "quarkus.class-loading.removed-artifacts";
3637
static final String CLASS_LOADING_PARENT_FIRST_ARTIFACTS = "quarkus.class-loading.parent-first-artifacts";
38+
static final String FILTER_OPTIONAL_DEPENDENCIES = "quarkus.package.filter-optional-dependencies";
39+
static final String INCLUDED_OPTIONAL_DEPENDENCIES = "quarkus.package.included-optional-dependencies";
3740

3841
@Inject
3942
public QuarkusBuildDependencies() {
@@ -139,33 +142,36 @@ private void jarDependencies(Path libBoot, Path libMain) {
139142
Map<String, String> configMap = extension().buildEffectiveConfiguration(appModel.getAppArtifact()).configMap();
140143

141144
// see https://quarkus.io/guides/class-loading-reference#configuring-class-loading
142-
String removedArtifactsProp = configMap.getOrDefault(CLASS_LOADING_PARENT_FIRST_ARTIFACTS, "");
143-
java.util.Optional<Set<ArtifactKey>> optionalDependencies = java.util.Optional.ofNullable(
145+
Set<ArtifactKey> removedArtifacts = java.util.Optional.ofNullable(
144146
configMap.getOrDefault(CLASS_LOADING_REMOVED_ARTIFACTS, null))
145-
.map(s -> Arrays.stream(s.split(","))
146-
.map(String::trim)
147-
.filter(gact -> !gact.isEmpty())
148-
.map(ArtifactKey::fromString)
149-
.collect(Collectors.toSet()));
150-
Set<ArtifactKey> removedArtifacts = Arrays.stream(removedArtifactsProp.split(","))
151-
.map(String::trim)
152-
.filter(gact -> !gact.isEmpty())
153-
.map(ArtifactKey::fromString)
154-
.collect(Collectors.toSet());
147+
.map(QuarkusBuildDependencies::dependenciesListToArtifactKeySet)
148+
.orElse(Collections.emptySet());
149+
getLogger().info("Removed artifacts: {}", configMap.getOrDefault(CLASS_LOADING_REMOVED_ARTIFACTS, "(none)"));
150+
151+
String parentFirstArtifactsProp = configMap.getOrDefault(CLASS_LOADING_PARENT_FIRST_ARTIFACTS, "");
152+
Set<ArtifactKey> parentFirstArtifacts = dependenciesListToArtifactKeySet(parentFirstArtifactsProp);
153+
getLogger().info("parent first artifacts: {}", configMap.getOrDefault(CLASS_LOADING_PARENT_FIRST_ARTIFACTS, "(none)"));
154+
155+
String optionalDependenciesProp = configMap.getOrDefault(INCLUDED_OPTIONAL_DEPENDENCIES, "");
156+
boolean filterOptionalDependencies = Boolean
157+
.parseBoolean(configMap.getOrDefault(FILTER_OPTIONAL_DEPENDENCIES, "false"));
158+
Set<ArtifactKey> optionalDependencies = filterOptionalDependencies
159+
? dependenciesListToArtifactKeySet(optionalDependenciesProp)
160+
: Collections.emptySet();
155161

156162
appModel.getRuntimeDependencies().stream()
157163
.filter(appDep -> {
158164
// copied from io.quarkus.deployment.pkg.steps.JarResultBuildStep.includeAppDep
159165
if (!appDep.isJar()) {
160166
return false;
161167
}
162-
if (appDep.isOptional()) {
163-
return optionalDependencies.map(appArtifactKeys -> appArtifactKeys.contains(appDep.getKey()))
164-
.orElse(true);
168+
if (filterOptionalDependencies && appDep.isOptional()) {
169+
return optionalDependencies.contains(appDep.getKey());
165170
}
166171
return !removedArtifacts.contains(appDep.getKey());
167172
})
168-
.map(dep -> Map.entry(dep.isFlagSet(DependencyFlags.CLASSLOADER_RUNNER_PARENT_FIRST) ? libBoot : libMain, dep))
173+
.map(dep -> Map.entry(dep.isFlagSet(DependencyFlags.CLASSLOADER_RUNNER_PARENT_FIRST)
174+
|| parentFirstArtifacts.contains(dep.getKey()) ? libBoot : libMain, dep))
169175
.peek(depAndTarget -> {
170176
ResolvedDependency dep = depAndTarget.getValue();
171177
Path targetDir = depAndTarget.getKey();
@@ -199,4 +205,12 @@ private void jarDependencies(Path libBoot, Path libMain) {
199205
.collect(Collectors.toMap(Map.Entry::getKey, depAndTarget -> 1, Integer::sum))
200206
.forEach((path, count) -> getLogger().info("Copied {} files into {}", count, path));
201207
}
208+
209+
private static Set<ArtifactKey> dependenciesListToArtifactKeySet(String optionalDependenciesProp) {
210+
return Arrays.stream(optionalDependenciesProp.split(","))
211+
.map(String::trim)
212+
.filter(gact -> !gact.isEmpty())
213+
.map(ArtifactKey::fromString)
214+
.collect(Collectors.toSet());
215+
}
202216
}

0 commit comments

Comments
 (0)