gnodet-bot commented on code in PR #13792:
URL: https://github.com/apache/maven/pull/13792#discussion_r4479950685
##########
impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/MavenInvoker.java:
##########
@@ -528,6 +531,69 @@ protected int doExecute(MavenContext context,
MavenExecutionRequest request) thr
}
}
+ /**
+ * When an {@link ArtifactFilteredOutException} is found in the exception
chain, log a reactor-aware hint
+ * that precisely identifies whether the artifact is an unselected
project, an already-selected project, or
+ * a pure repository-manager configuration issue.
+ */
+ protected void logFilteredOutHint(MavenContext context, Throwable
exception, MavenExecutionResult result) {
+ ArtifactFilteredOutException filteredOut = findCause(exception,
ArtifactFilteredOutException.class);
+ if (filteredOut == null) {
+ return;
+ }
+
+ Artifact artifact = filteredOut.getArtifact();
+ if (artifact == null) {
+ return;
+ }
+
+ String groupId = artifact.getGroupId();
+ String artifactId = artifact.getArtifactId();
+ String version = artifact.getVersion();
+ String coords = groupId + ":" + artifactId + ":" + version;
+
+ List<MavenProject> allProjects = result.getAllProjects();
+ List<MavenProject> selectedProjects =
result.getTopologicallySortedProjects();
+
+ boolean inAll = allProjects.stream()
+ .anyMatch(p -> p.getGroupId().equals(groupId)
+ && p.getArtifactId().equals(artifactId)
+ && p.getVersion().equals(version));
+ boolean inSelected = selectedProjects.stream()
+ .anyMatch(p -> p.getGroupId().equals(groupId)
+ && p.getArtifactId().equals(artifactId)
+ && p.getVersion().equals(version));
+
+ context.logger.error("");
+ if (inAll && !inSelected) {
+ context.logger.error(coords
+ + " is a project of this build but was not selected."
+ + " Add -am to also build its dependencies, or run the
full reactor.");
+ } else if (inAll) {
+ context.logger.error(coords
+ + " is part of this build but has not been built yet."
+ + " Build it first or reorder the reactor.");
+ } else {
+ context.logger.error("This error indicates that a remote
repository filter has rejected " + coords + "."
+ + " This commonly happens with repository managers using
virtual/group repositories"
+ + " that do not properly aggregate prefix files.");
+ context.logger.error("To disable remote repository filtering, add
one or both of these to your command line"
+ + " or to .mvn/maven.config:");
+ context.logger.error("
-Daether.remoteRepositoryFilter.prefixes=false");
+ context.logger.error("
-Daether.remoteRepositoryFilter.groupId=false");
+ context.logger.error("See
https://maven.apache.org/resolver/remote-repository-filtering.html");
+ }
+ }
+
+ private static <T extends Throwable> T findCause(Throwable exception,
Class<T> type) {
+ for (Throwable t = exception; t != null && t != t.getCause(); t =
t.getCause()) {
Review Comment:
⚠️ **Incomplete cycle guard**: `t != t.getCause()` only catches direct
self-loops (a→a). A two-hop cycle (a→b→a) will loop forever: `t=a` passes
(a≠b), `t=b` passes (b≠a), `t=a` again, repeat.
`DefaultExceptionHandler.findCause()` uses a `Set<Throwable> dejaVu` identity
set for the same reason. Use the same pattern here:
```suggestion
Set<Throwable> seen = Collections.newSetFromMap(new
java.util.IdentityHashMap<>());
for (Throwable t = exception; t != null && seen.add(t); t =
t.getCause()) {
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]