28
28
import java .util .Collections ;
29
29
import java .util .HashMap ;
30
30
import java .util .List ;
31
+ import java .util .Locale ;
31
32
import java .util .Map ;
32
33
import java .util .Objects ;
33
34
55
56
import org .eclipse .aether .spi .locator .Service ;
56
57
import org .eclipse .aether .spi .locator .ServiceLocator ;
57
58
import org .eclipse .aether .spi .synccontext .SyncContextFactory ;
59
+ import org .eclipse .aether .util .ConfigUtils ;
58
60
import org .eclipse .aether .util .version .GenericVersionScheme ;
59
61
import org .eclipse .aether .version .InvalidVersionSpecificationException ;
60
62
import org .eclipse .aether .version .Version ;
68
70
@ Named
69
71
@ Singleton
70
72
public class DefaultVersionRangeResolver implements VersionRangeResolver , Service {
73
+ /**
74
+ * Configuration property for version range resolution used metadata {@link Metadata.Nature}.
75
+ * It may contain string names of {@link Metadata.Nature} enum values, or string value {@code "auto"}
76
+ * to decide based on range: if any of the boundary versions is snapshot, {@link Metadata.Nature#RELEASE_OR_SNAPSHOT}
77
+ * will be used, otherwise {@link Metadata.Nature#RELEASE}.
78
+ * Default (when unset) is existing Maven 3 behaviour, using {@link Metadata.Nature#RELEASE_OR_SNAPSHOT}.
79
+ *
80
+ * @since 3.9.11
81
+ */
82
+ public static final String MAVEN_VERSION_RANGE_RESOLUTION_NATURE = "maven.versionRangeResolutionNature" ;
71
83
72
84
private static final String MAVEN_METADATA_XML = "maven-metadata.xml" ;
73
85
@@ -138,11 +150,34 @@ public VersionRangeResult resolveVersionRange(RepositorySystemSession session, V
138
150
result .addVersion (versionConstraint .getVersion ());
139
151
} else {
140
152
VersionRange .Bound lowerBound = versionConstraint .getRange ().getLowerBound ();
141
- if ( lowerBound != null
142
- && lowerBound .equals (versionConstraint . getRange (). getUpperBound () )) {
153
+ VersionRange . Bound upperBound = versionConstraint . getRange (). getUpperBound ();
154
+ if ( lowerBound != null && lowerBound .equals (upperBound )) {
143
155
result .addVersion (lowerBound .getVersion ());
144
156
} else {
145
- Map <String , ArtifactRepository > versionIndex = getVersions (session , result , request );
157
+ Metadata .Nature wantedNature ;
158
+ String natureString = ConfigUtils .getString (
159
+ session , Metadata .Nature .RELEASE_OR_SNAPSHOT .name (), MAVEN_VERSION_RANGE_RESOLUTION_NATURE );
160
+ if ("auto" .equals (natureString )) {
161
+ org .eclipse .aether .artifact .Artifact lowerArtifact = lowerBound != null
162
+ ? request .getArtifact ()
163
+ .setVersion (lowerBound .getVersion ().toString ())
164
+ : null ;
165
+ org .eclipse .aether .artifact .Artifact upperArtifact = upperBound != null
166
+ ? request .getArtifact ()
167
+ .setVersion (upperBound .getVersion ().toString ())
168
+ : null ;
169
+
170
+ if (lowerArtifact != null && lowerArtifact .isSnapshot ()
171
+ || upperArtifact != null && upperArtifact .isSnapshot ()) {
172
+ wantedNature = Metadata .Nature .RELEASE_OR_SNAPSHOT ;
173
+ } else {
174
+ wantedNature = Metadata .Nature .RELEASE ;
175
+ }
176
+ } else {
177
+ wantedNature = Metadata .Nature .valueOf (natureString .toUpperCase (Locale .ROOT ));
178
+ }
179
+
180
+ Map <String , ArtifactRepository > versionIndex = getVersions (session , result , request , wantedNature );
146
181
147
182
List <Version > versions = new ArrayList <>();
148
183
for (Map .Entry <String , ArtifactRepository > v : versionIndex .entrySet ()) {
@@ -166,7 +201,10 @@ public VersionRangeResult resolveVersionRange(RepositorySystemSession session, V
166
201
}
167
202
168
203
private Map <String , ArtifactRepository > getVersions (
169
- RepositorySystemSession session , VersionRangeResult result , VersionRangeRequest request ) {
204
+ RepositorySystemSession session ,
205
+ VersionRangeResult result ,
206
+ VersionRangeRequest request ,
207
+ Metadata .Nature wantedNature ) {
170
208
RequestTrace trace = RequestTrace .newChild (request .getTrace (), request );
171
209
172
210
Map <String , ArtifactRepository > versionIndex = new HashMap <>();
@@ -175,7 +213,7 @@ private Map<String, ArtifactRepository> getVersions(
175
213
request .getArtifact ().getGroupId (),
176
214
request .getArtifact ().getArtifactId (),
177
215
MAVEN_METADATA_XML ,
178
- Metadata . Nature . RELEASE_OR_SNAPSHOT );
216
+ wantedNature );
179
217
180
218
List <MetadataRequest > metadataRequests =
181
219
new ArrayList <>(request .getRepositories ().size ());
0 commit comments