[ https://issues.apache.org/jira/browse/MRESOLVER-466?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17809930#comment-17809930 ]
ASF GitHub Bot commented on MRESOLVER-466: ------------------------------------------ cstamas commented on code in PR #409: URL: https://github.com/apache/maven-resolver/pull/409#discussion_r1463215080 ########## src/site/markdown/common-misconceptions.md: ########## @@ -0,0 +1,204 @@ +# Common Misconceptions +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +Due to smooth transitions from Maven2 into Maven3 (and soon +Maven4), and the fact that Maven2 plugins kept working with Maven3, maybe +even without change, there were some misconceptions crept in +as well. Despite the marvel of "compatibility", Maven3 resolution +differs quite much from Maven2, and the sole reason is actual improvement +in area of resolution, it became much more precise (and, due +that lost some "bad" habits present in Maven2). Here, we will try to +enumerate some of the most common misconceptions. + +## Misconception No1: How Resolver Works + +(Simplified) + +The most typical use case for Resolver is to "resolve transitively" +dependencies. Resolver, to achieve this, internally (but these are +exposed via API as distinguished API calls as well) performs 3 steps: +"collect", "transform" and "resolve". + +The "collect" step is first, where it builds the "dirty tree" (dirty graph) +of artifacts. It is important to remark, that in "collect" step, while +the graph is being built, Maven uses only POMs. Hence, if collecting an +Artifact that was never downloaded to your local repository, it will +download **the POMs only**. Using POMs resolver is able to build current +"node" of graph, but also figure outgoing vertices and adjacent nodes of +current node and so on. Which dependency is chosen to continue with from +the current node POM is decided by various criteria (configured). + +The "transform" step transforms the "dirty graph": this is where conflict resolution +happens. It is here when resolver applies various rules to resolve conflicting +versions, conflicting scopes, and so on. Here, if "verbose tree" is asked for, +conflict resolution does not remove graph nodes, merely marks the conflicts +and the conflict "winner". Thus, "verbose tree" cannot be resolved. + +Finally, the "resolve" step runs, when the (transformed) graph node artifacts +are being resolved, basically ensuring (and downloading if needed) their +correspondent files (i.e. JAR files) are present in local repository. + +It is important to state, that in "collect" step happens the selection of nodes +by various criteria, among other by the configured scope filters. And here we +come to the notion of "runtime classpath" vs "test classpath". + +In resolver, maybe un-intuitively, the "scope filter" is usually used (but does +not have to, this is just how it IS used in Maven Core, probably for historical +reasons) as "what should be omitted". The default session filter in Maven +is set up as this: + +``` + new ScopeDependencySelector("test", "provided") +``` + +This means, that "current dependency node" dependencies in "test" and "provided" scope +will be simply omitted from the graph. In other words, this filter builds +the "downstream runtime classpath" of supplied artifact (i.e. "what is needed by the +artifact at runtime when I depend on it"). + +With selector like this: + +``` + new ScopeDependencySelector("provided") +``` + +the "downstream dependency test classpath" would be built. Aside of giving example, +this selector is actually never used, as "test classpath" makes sense only in the +scope of "current project", but not for "downstream dependant projects". + +Note: these are NOT "Maven related" notions yet, there is nowhere Maven in picture here, +and these are not the classpath used by Compiler or Surefire plugins, merely just +a showcase how Resolver works. + + +## Misconception No2: "Test classpath" Is Superset of "Runtime classpath" Review Comment: ```suggestion ## Misconception No2: "Test classpath" Is Superset Of "Runtime classpath" ``` > Extend site documentation > ------------------------- > > Key: MRESOLVER-466 > URL: https://issues.apache.org/jira/browse/MRESOLVER-466 > Project: Maven Resolver > Issue Type: Task > Components: Resolver > Reporter: Tamas Cservenak > Assignee: Tamas Cservenak > Priority: Major > Fix For: 2.0.0, 2.0.0-alpha-7 > > > Add more details to site (RRF, Checksums, etc). -- This message was sent by Atlassian Jira (v8.20.10#820010)