in impl/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java [175:271]
private void selectVersion(DefaultPluginVersionResult result, PluginVersionRequest request, Versions versions)
throws PluginVersionResolutionException {
String version = null;
ArtifactRepository repo = null;
boolean resolvedPluginVersions = !versions.versions.isEmpty();
boolean searchPerformed = false;
if (versions.releaseVersion != null && !versions.releaseVersion.isEmpty()) {
version = versions.releaseVersion;
repo = versions.releaseRepository;
} else if (versions.latestVersion != null && !versions.latestVersion.isEmpty()) {
version = versions.latestVersion;
repo = versions.latestRepository;
}
if (version != null && !isCompatible(request, version)) {
logger.info(
"Latest version of plugin {}:{} failed compatibility check",
request.getGroupId(),
request.getArtifactId());
versions.versions.remove(version);
version = null;
searchPerformed = true;
}
if (version == null) {
TreeSet<Version> releases = new TreeSet<>(Collections.reverseOrder());
TreeSet<Version> snapshots = new TreeSet<>(Collections.reverseOrder());
for (String ver : versions.versions.keySet()) {
try {
Version v = versionScheme.parseVersion(ver);
if (ver.endsWith("-SNAPSHOT")) {
snapshots.add(v);
} else {
releases.add(v);
}
} catch (InvalidVersionSpecificationException e) {
// ignore
}
}
if (!releases.isEmpty()) {
logger.info(
"Looking for compatible RELEASE version of plugin {}:{}",
request.getGroupId(),
request.getArtifactId());
for (Version v : releases) {
String ver = v.toString();
if (isCompatible(request, ver)) {
version = ver;
repo = versions.versions.get(version);
break;
}
}
}
if (version == null && !snapshots.isEmpty()) {
logger.info(
"Looking for compatible SNAPSHOT version of plugin {}:{}",
request.getGroupId(),
request.getArtifactId());
for (Version v : snapshots) {
String ver = v.toString();
if (isCompatible(request, ver)) {
version = ver;
repo = versions.versions.get(version);
break;
}
}
}
}
if (version != null) {
// if LATEST worked out of the box, remain silent as today, otherwise inform user about search result
if (searchPerformed) {
logger.info("Selected plugin {}:{}:{}", request.getGroupId(), request.getArtifactId(), version);
}
result.setVersion(version);
result.setRepository(repo);
} else {
logger.warn(
resolvedPluginVersions
? "Could not find compatible version of plugin {}:{} in any plugin repository"
: "Plugin {}:{} not found in any plugin repository",
request.getGroupId(),
request.getArtifactId());
throw new PluginVersionResolutionException(
request.getGroupId(),
request.getArtifactId(),
request.getRepositorySession().getLocalRepository(),
request.getRepositories(),
resolvedPluginVersions
? "Could not find compatible plugin version in any plugin repository"
: "Plugin not found in any plugin repository");
}
}