2828import java .util .Collections ;
2929import java .util .HashMap ;
3030import java .util .List ;
31+ import java .util .Locale ;
3132import java .util .Map ;
3233import java .util .Objects ;
3334
5556import org .eclipse .aether .spi .locator .Service ;
5657import org .eclipse .aether .spi .locator .ServiceLocator ;
5758import org .eclipse .aether .spi .synccontext .SyncContextFactory ;
59+ import org .eclipse .aether .util .ConfigUtils ;
5860import org .eclipse .aether .util .version .GenericVersionScheme ;
5961import org .eclipse .aether .version .InvalidVersionSpecificationException ;
6062import org .eclipse .aether .version .Version ;
6870@ Named
6971@ Singleton
7072public 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" ;
7183
7284 private static final String MAVEN_METADATA_XML = "maven-metadata.xml" ;
7385
@@ -138,11 +150,34 @@ public VersionRangeResult resolveVersionRange(RepositorySystemSession session, V
138150 result .addVersion (versionConstraint .getVersion ());
139151 } else {
140152 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 )) {
143155 result .addVersion (lowerBound .getVersion ());
144156 } 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 );
146181
147182 List <Version > versions = new ArrayList <>();
148183 for (Map .Entry <String , ArtifactRepository > v : versionIndex .entrySet ()) {
@@ -166,7 +201,10 @@ public VersionRangeResult resolveVersionRange(RepositorySystemSession session, V
166201 }
167202
168203 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 ) {
170208 RequestTrace trace = RequestTrace .newChild (request .getTrace (), request );
171209
172210 Map <String , ArtifactRepository > versionIndex = new HashMap <>();
@@ -175,7 +213,7 @@ private Map<String, ArtifactRepository> getVersions(
175213 request .getArtifact ().getGroupId (),
176214 request .getArtifact ().getArtifactId (),
177215 MAVEN_METADATA_XML ,
178- Metadata . Nature . RELEASE_OR_SNAPSHOT );
216+ wantedNature );
179217
180218 List <MetadataRequest > metadataRequests =
181219 new ArrayList <>(request .getRepositories ().size ());
0 commit comments