|
5 | 5 | import java.nio.file.Files; |
6 | 6 | import java.nio.file.Path; |
7 | 7 | import java.util.Arrays; |
| 8 | +import java.util.Collections; |
8 | 9 | import java.util.HashMap; |
9 | 10 | import java.util.Map; |
10 | 11 | import java.util.Set; |
|
34 | 35 | public abstract class QuarkusBuildDependencies extends QuarkusBuildTask { |
35 | 36 | static final String CLASS_LOADING_REMOVED_ARTIFACTS = "quarkus.class-loading.removed-artifacts"; |
36 | 37 | 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"; |
37 | 40 |
|
38 | 41 | @Inject |
39 | 42 | public QuarkusBuildDependencies() { |
@@ -139,33 +142,36 @@ private void jarDependencies(Path libBoot, Path libMain) { |
139 | 142 | Map<String, String> configMap = extension().buildEffectiveConfiguration(appModel.getAppArtifact()).configMap(); |
140 | 143 |
|
141 | 144 | // 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( |
144 | 146 | 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(); |
155 | 161 |
|
156 | 162 | appModel.getRuntimeDependencies().stream() |
157 | 163 | .filter(appDep -> { |
158 | 164 | // copied from io.quarkus.deployment.pkg.steps.JarResultBuildStep.includeAppDep |
159 | 165 | if (!appDep.isJar()) { |
160 | 166 | return false; |
161 | 167 | } |
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()); |
165 | 170 | } |
166 | 171 | return !removedArtifacts.contains(appDep.getKey()); |
167 | 172 | }) |
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)) |
169 | 175 | .peek(depAndTarget -> { |
170 | 176 | ResolvedDependency dep = depAndTarget.getValue(); |
171 | 177 | Path targetDir = depAndTarget.getKey(); |
@@ -199,4 +205,12 @@ private void jarDependencies(Path libBoot, Path libMain) { |
199 | 205 | .collect(Collectors.toMap(Map.Entry::getKey, depAndTarget -> 1, Integer::sum)) |
200 | 206 | .forEach((path, count) -> getLogger().info("Copied {} files into {}", count, path)); |
201 | 207 | } |
| 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 | + } |
202 | 216 | } |
0 commit comments