[ 
https://issues.apache.org/jira/browse/MNG-8609?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17954571#comment-17954571
 ] 

Elliotte Rusty Harold commented on MNG-8609:
--------------------------------------------

I don't think it's only a documentation problem, though it is a documentation 
problem. Most docs, both Maven's own and third party's and most discussions, 
have been cavalier about the distinction between dependencies and artifacts. 
However after spending multiple years deep in the weeds of Maven dependency 
management, I am increasingly convinced that being very precise about this is 
absolutely critical to explaining and understanding how Maven works.

Currently package-info says this and it does describe the current class 
inheritance structure. However I don't think that inheritance hierarchy is 
correct, and it does lead to confusion.

```
 * <p>{@link org.apache.maven.api.DependencyCoordinates} instances represent a 
dependency element in a POM.
 * A {@code DependencyCoordinates} extends {@code ArtifactCoordinates} with 
additional information about how
 * the artifact will be used: type, scope and obligation (whether the 
dependency is optional or mandatory).
 * The version and the obligation may not be defined precisely.</p>
 *
 * <p>{@link org.apache.maven.api.Dependency} instances represent artifacts in 
the repository
 * that are dependencies of the project.
 * They are created when <dfn>resolving</dfn> a {@code DependencyCoordinates}.
 * Resolving is the process that clarifies the obligation (optional or 
mandatory),
 * selects a particular version, and downloads the artifact into the local 
repository.</p>
```

This is a classic example of is-a/has-a confusion in OO. It is true currently 
that {@link org.apache.maven.api.Dependency} instances represent artifacts in 
the repository. However, that shouldn't be the case. Instead something like 
"ResolvedDependency" should contain (not inherit from) an Artifact field.  


> Dependency is not an Artifact
> -----------------------------
>
>                 Key: MNG-8609
>                 URL: https://issues.apache.org/jira/browse/MNG-8609
>             Project: Maven
>          Issue Type: Bug
>          Components: API
>            Reporter: Elliotte Rusty Harold
>            Priority: Blocker
>             Fix For: 4.1.0
>
>
> org.apache.maven.api.Dependency extends org.apache.maven.api.Artifact. This 
> violates the OO principal that inheritance represents an is-A relation. A 
> dependency is not an artifact. Arguably it has an artifact. However, 
> artifacts are nodes in the graph while dependencies are the arcs. These 
> aren't the same thing and mixing them up is a common source of confusion. 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to