Skip to content

Commit 7deffd2

Browse files
authored
Augment version range resolution used repositories (backport) (#10890)
Ability to control which repositories to be queried to resolve ranges. Introduced new property: (#2575) Ability to control which repositories to be queried to resolve ranges. Introduced new property: `maven.versionRangeResolver.natureOverride` that is used in VersionRangeResolver, and means: * not set; behave as before (default) * "auto" string; will check lower and upper bounds, and if any is snapshot, will querty snapshot reposes otherwise not * any valid value of resolver Metadata.Nature enum; then will use that Fixes: #2558 Backport of master 37b0699
1 parent 1bc065a commit 7deffd2

File tree

6 files changed

+106
-14
lines changed

6 files changed

+106
-14
lines changed

api/maven-api-core/src/main/java/org/apache/maven/api/Constants.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,22 @@ public final class Constants {
510510
@Config(type = "java.lang.Integer", defaultValue = "100")
511511
public static final String MAVEN_BUILDER_MAX_PROBLEMS = "maven.builder.maxProblems";
512512

513+
/**
514+
* Configuration property for version range resolution used metadata "nature".
515+
* It may contain following string values:
516+
* <ul>
517+
* <li>"auto" - decision done based on range being resolver: if any boundary is snapshot, use "release_or_snapshot", otherwise "release"</li>
518+
* <li>"release_or_snapshot" - the default</li>
519+
* <li>"release" - query only release repositories to discover versions</li>
520+
* <li>"snapshot" - query only snapshot repositories to discover versions</li>
521+
* </ul>
522+
* Default (when unset) is existing Maven behaviour: "release_or_snapshots".
523+
* @since 4.0.0
524+
*/
525+
@Config(defaultValue = "release_or_snapshot")
526+
public static final String MAVEN_VERSION_RANGE_RESOLVER_NATURE_OVERRIDE =
527+
"maven.versionRangeResolver.natureOverride";
528+
513529
/**
514530
* All system properties used by Maven Logger start with this prefix.
515531
*

compat/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@
2828
import java.util.Collections;
2929
import java.util.HashMap;
3030
import java.util.List;
31+
import java.util.Locale;
3132
import java.util.Map;
3233
import java.util.Objects;
3334

35+
import org.apache.maven.api.Constants;
3436
import org.apache.maven.artifact.ArtifactUtils;
3537
import org.apache.maven.artifact.repository.metadata.Versioning;
3638
import org.apache.maven.metadata.v4.MetadataStaxReader;
@@ -53,6 +55,7 @@
5355
import org.eclipse.aether.resolution.VersionRangeResolutionException;
5456
import org.eclipse.aether.resolution.VersionRangeResult;
5557
import org.eclipse.aether.spi.synccontext.SyncContextFactory;
58+
import org.eclipse.aether.util.ConfigUtils;
5659
import org.eclipse.aether.version.InvalidVersionSpecificationException;
5760
import org.eclipse.aether.version.Version;
5861
import org.eclipse.aether.version.VersionConstraint;
@@ -107,11 +110,37 @@ public VersionRangeResult resolveVersionRange(RepositorySystemSession session, V
107110
result.addVersion(versionConstraint.getVersion());
108111
} else {
109112
VersionRange.Bound lowerBound = versionConstraint.getRange().getLowerBound();
113+
VersionRange.Bound upperBound = versionConstraint.getRange().getUpperBound();
110114
if (lowerBound != null
111115
&& lowerBound.equals(versionConstraint.getRange().getUpperBound())) {
112116
result.addVersion(lowerBound.getVersion());
113117
} else {
114-
Map<String, ArtifactRepository> versionIndex = getVersions(session, result, request);
118+
Metadata.Nature wantedNature;
119+
String natureString = ConfigUtils.getString(
120+
session,
121+
Metadata.Nature.RELEASE_OR_SNAPSHOT.name(),
122+
Constants.MAVEN_VERSION_RANGE_RESOLVER_NATURE_OVERRIDE);
123+
if ("auto".equals(natureString)) {
124+
org.eclipse.aether.artifact.Artifact lowerArtifact = lowerBound != null
125+
? request.getArtifact()
126+
.setVersion(lowerBound.getVersion().toString())
127+
: null;
128+
org.eclipse.aether.artifact.Artifact upperArtifact = upperBound != null
129+
? request.getArtifact()
130+
.setVersion(upperBound.getVersion().toString())
131+
: null;
132+
133+
if (lowerArtifact != null && lowerArtifact.isSnapshot()
134+
|| upperArtifact != null && upperArtifact.isSnapshot()) {
135+
wantedNature = Metadata.Nature.RELEASE_OR_SNAPSHOT;
136+
} else {
137+
wantedNature = Metadata.Nature.RELEASE;
138+
}
139+
} else {
140+
wantedNature = Metadata.Nature.valueOf(natureString.toUpperCase(Locale.ROOT));
141+
}
142+
143+
Map<String, ArtifactRepository> versionIndex = getVersions(session, result, request, wantedNature);
115144

116145
List<Version> versions = new ArrayList<>();
117146
for (Map.Entry<String, ArtifactRepository> v : versionIndex.entrySet()) {
@@ -135,7 +164,10 @@ public VersionRangeResult resolveVersionRange(RepositorySystemSession session, V
135164
}
136165

137166
private Map<String, ArtifactRepository> getVersions(
138-
RepositorySystemSession session, VersionRangeResult result, VersionRangeRequest request) {
167+
RepositorySystemSession session,
168+
VersionRangeResult result,
169+
VersionRangeRequest request,
170+
Metadata.Nature wantedNature) {
139171
RequestTrace trace = RequestTrace.newChild(request.getTrace(), request);
140172

141173
Map<String, ArtifactRepository> versionIndex = new HashMap<>();
@@ -144,7 +176,7 @@ private Map<String, ArtifactRepository> getVersions(
144176
request.getArtifact().getGroupId(),
145177
request.getArtifact().getArtifactId(),
146178
MAVEN_METADATA_XML,
147-
Metadata.Nature.RELEASE_OR_SNAPSHOT);
179+
wantedNature);
148180

149181
List<MetadataRequest> metadataRequests =
150182
new ArrayList<>(request.getRepositories().size());

impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/DefaultVersionRangeResolver.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
import java.util.Collections;
2525
import java.util.HashMap;
2626
import java.util.List;
27+
import java.util.Locale;
2728
import java.util.Map;
2829
import java.util.Objects;
2930

31+
import org.apache.maven.api.Constants;
3032
import org.apache.maven.api.di.Inject;
3133
import org.apache.maven.api.di.Named;
3234
import org.apache.maven.api.di.Singleton;
@@ -52,6 +54,7 @@
5254
import org.eclipse.aether.resolution.VersionRangeResolutionException;
5355
import org.eclipse.aether.resolution.VersionRangeResult;
5456
import org.eclipse.aether.spi.synccontext.SyncContextFactory;
57+
import org.eclipse.aether.util.ConfigUtils;
5558
import org.eclipse.aether.version.InvalidVersionSpecificationException;
5659
import org.eclipse.aether.version.Version;
5760
import org.eclipse.aether.version.VersionConstraint;
@@ -104,11 +107,36 @@ public VersionRangeResult resolveVersionRange(RepositorySystemSession session, V
104107
result.addVersion(versionConstraint.getVersion());
105108
} else {
106109
VersionRange.Bound lowerBound = versionConstraint.getRange().getLowerBound();
107-
if (lowerBound != null
108-
&& lowerBound.equals(versionConstraint.getRange().getUpperBound())) {
110+
VersionRange.Bound upperBound = versionConstraint.getRange().getUpperBound();
111+
if (lowerBound != null && lowerBound.equals(upperBound)) {
109112
result.addVersion(lowerBound.getVersion());
110113
} else {
111-
Map<String, ArtifactRepository> versionIndex = getVersions(session, result, request);
114+
Metadata.Nature wantedNature;
115+
String natureString = ConfigUtils.getString(
116+
session,
117+
Metadata.Nature.RELEASE_OR_SNAPSHOT.name(),
118+
Constants.MAVEN_VERSION_RANGE_RESOLVER_NATURE_OVERRIDE);
119+
if ("auto".equals(natureString)) {
120+
org.eclipse.aether.artifact.Artifact lowerArtifact = lowerBound != null
121+
? request.getArtifact()
122+
.setVersion(lowerBound.getVersion().toString())
123+
: null;
124+
org.eclipse.aether.artifact.Artifact upperArtifact = upperBound != null
125+
? request.getArtifact()
126+
.setVersion(upperBound.getVersion().toString())
127+
: null;
128+
129+
if (lowerArtifact != null && lowerArtifact.isSnapshot()
130+
|| upperArtifact != null && upperArtifact.isSnapshot()) {
131+
wantedNature = Metadata.Nature.RELEASE_OR_SNAPSHOT;
132+
} else {
133+
wantedNature = Metadata.Nature.RELEASE;
134+
}
135+
} else {
136+
wantedNature = Metadata.Nature.valueOf(natureString.toUpperCase(Locale.ROOT));
137+
}
138+
139+
Map<String, ArtifactRepository> versionIndex = getVersions(session, result, request, wantedNature);
112140

113141
List<Version> versions = new ArrayList<>();
114142
for (Map.Entry<String, ArtifactRepository> v : versionIndex.entrySet()) {
@@ -132,7 +160,10 @@ public VersionRangeResult resolveVersionRange(RepositorySystemSession session, V
132160
}
133161

134162
private Map<String, ArtifactRepository> getVersions(
135-
RepositorySystemSession session, VersionRangeResult result, VersionRangeRequest request) {
163+
RepositorySystemSession session,
164+
VersionRangeResult result,
165+
VersionRangeRequest request,
166+
Metadata.Nature wantedNature) {
136167
RequestTrace trace = RequestTrace.newChild(request.getTrace(), request);
137168

138169
Map<String, ArtifactRepository> versionIndex = new HashMap<>();
@@ -141,7 +172,7 @@ private Map<String, ArtifactRepository> getVersions(
141172
request.getArtifact().getGroupId(),
142173
request.getArtifact().getArtifactId(),
143174
MAVEN_METADATA_XML,
144-
Metadata.Nature.RELEASE_OR_SNAPSHOT);
175+
wantedNature);
145176

146177
List<MetadataRequest> metadataRequests =
147178
new ArrayList<>(request.getRepositories().size());

src/site/markdown/configuration.properties

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
# Generated from: maven-resolver-tools/src/main/resources/configuration.properties.vm
2121
# To modify this file, edit the template and regenerate.
2222
#
23-
props.count = 63
23+
props.count = 64
2424
props.1.key = maven.build.timestamp.format
2525
props.1.configurationType = String
2626
props.1.description = Build timestamp format.
@@ -391,9 +391,15 @@ props.62.description = Maven snapshot: contains "true" if this Maven is a snapsh
391391
props.62.defaultValue =
392392
props.62.since = 4.0.0
393393
props.62.configurationSource = system_properties
394-
props.63.key = maven.versionResolver.noCache
395-
props.63.configurationType = Boolean
396-
props.63.description = User property for disabling version resolver cache.
397-
props.63.defaultValue = false
398-
props.63.since = 3.0.0
394+
props.63.key = maven.versionRangeResolver.natureOverride
395+
props.63.configurationType = String
396+
props.63.description = Configuration property for version range resolution used metadata "nature". It may contain following string values: <ul> <li>"auto" - decision done based on range being resolver: if any boundary is snapshot, use "release_or_snapshot", otherwise "release"</li> <li>"release_or_snapshot" - the default</li> <li>"release" - query only release repositories to discover versions</li> <li>"snapshot" - query only snapshot repositories to discover versions</li> </ul> Default (when unset) is existing Maven behaviour: "release_or_snapshots".
397+
props.63.defaultValue = release_or_snapshot
398+
props.63.since = 4.0.0
399399
props.63.configurationSource = User properties
400+
props.64.key = maven.versionResolver.noCache
401+
props.64.configurationType = Boolean
402+
props.64.description = User property for disabling version resolver cache.
403+
props.64.defaultValue = false
404+
props.64.since = 3.0.0
405+
props.64.configurationSource = User properties

src/site/markdown/configuration.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,12 @@ props:
391391
defaultValue:
392392
since: 4.0.0
393393
configurationSource: system_properties
394+
- key: maven.versionRangeResolver.natureOverride
395+
configurationType: String
396+
description: "Configuration property for version range resolution used metadata \"nature\". It may contain following string values: <ul> <li>\"auto\" - decision done based on range being resolver: if any boundary is snapshot, use \"release_or_snapshot\", otherwise \"release\"</li> <li>\"release_or_snapshot\" - the default</li> <li>\"release\" - query only release repositories to discover versions</li> <li>\"snapshot\" - query only snapshot repositories to discover versions</li> </ul> Default (when unset) is existing Maven behaviour: \"release_or_snapshots\"."
397+
defaultValue: release_or_snapshot
398+
since: 4.0.0
399+
configurationSource: User properties
394400
- key: maven.versionResolver.noCache
395401
configurationType: Boolean
396402
description: "User property for disabling version resolver cache."

src/site/markdown/maven-configuration.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,5 +93,6 @@ To modify this file, edit the template and regenerate.
9393
| `maven.version.minor` | `String` | Maven minor version: contains the minor segment of this Maven version. | - | 4.0.0 | system_properties |
9494
| `maven.version.patch` | `String` | Maven patch version: contains the patch segment of this Maven version. | - | 4.0.0 | system_properties |
9595
| `maven.version.snapshot` | `String` | Maven snapshot: contains "true" if this Maven is a snapshot version. | - | 4.0.0 | system_properties |
96+
| `maven.versionRangeResolver.natureOverride` | `String` | Configuration property for version range resolution used metadata "nature". It may contain following string values: <ul> <li>"auto" - decision done based on range being resolver: if any boundary is snapshot, use "release_or_snapshot", otherwise "release"</li> <li>"release_or_snapshot" - the default</li> <li>"release" - query only release repositories to discover versions</li> <li>"snapshot" - query only snapshot repositories to discover versions</li> </ul> Default (when unset) is existing Maven behaviour: "release_or_snapshots". | `release_or_snapshot` | 4.0.0 | User properties |
9697
| `maven.versionResolver.noCache` | `Boolean` | User property for disabling version resolver cache. | `false` | 3.0.0 | User properties |
9798

0 commit comments

Comments
 (0)