You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by Tomo Suzuki <su...@google.com.INVALID> on 2020/02/07 22:36:17 UTC

[maven-resolver] DefaultDependencyCollector not collecting direct provided dependencies

Hi Maven developers,

I find DefaultDependencyCollector is not getting "direct" and
"provided" dependencies by default. Is this expected behavior?

Background:
We use maven-resolver in our Java code. We create
RepositorySystemSesison through MavenRepositorySystemUtils.newSession
[1]. We use the session and DefaultDependencyCollector through
RepositorySystem.collectDependencies [2] to get the dependency graph
of a Maven artifact.

Problem:
The dependency graph from RepositorySystem.collectDependencies does
not have direct provided dependencies. I expect provided dependencies
should be included in the graph when they are direct dependencies.

Analysis:
- MavenRepositorySystemUtils.newSession [3] creates
ScopedDependencySelector("test", "provided")
- ScopeDependencySelector.deriveChildSelector [4] creates clone of
itself with transitive=true. When transitive=true, it does not select
"provided" dependency.
- DefaultDependencyCollector.collectDependencies [5] always call
deriveChildSelector before using the selector from the session.
- Therefore, ScopeDependencySelector always has transitive=true ( to
exclude provided dependencies) when it's used with
DefaultDependencyCollector.

[1]: https://github.com/GoogleCloudPlatform/cloud-opensource-java/blob/50da79355e042c5ff14ec72230cc6edbddcf8436/dependencies/src/main/java/com/google/cloud/tools/opensource/dependencies/RepositoryUtility.java#L112
[2]: https://github.com/GoogleCloudPlatform/cloud-opensource-java/blob/50da79355e042c5ff14ec72230cc6edbddcf8436/dependencies/src/main/java/com/google/cloud/tools/opensource/dependencies/DependencyGraphBuilder.java#L179
[3]: https://github.com/apache/maven/blob/master/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java#L102
[4]: https://github.com/apache/maven-resolver/blob/47edcfe69c4e52ced4cb93d65b7348b5645cdd68/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java#L119
[5]: https://github.com/apache/maven-resolver/blob/18dd2b5cde851256a9f44db25097efee0691d6b4/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java#L255

-- 
Regards,
Tomo

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: [maven-resolver] DefaultDependencyCollector not collecting direct provided dependencies

Posted by Tomo Suzuki <su...@google.com.INVALID>.
ProjectDependencyResolver does what I expect for provided dependencies [1].

With DefaultDependencyCollector, provided-scope dependencies of the
root node are not picked up, because the root node itself is a
dependency (with a scope), making the provided-scope dependencies
transitive ones.

With ProjectDependencyResolver, the root node is not a dependency. It
does not have a scope. Therefore provided-scope dependencies below the
root are direct dependencies.

Added a image to show the comparison [2]. Case closed.

[1]: https://github.com/suztomo/maven-provided-scope/blob/master/src/test/java/suztomo/TestProjectDependencyResolver.java#L136
[2]: https://github.com/suztomo/maven-provided-scope#comparison-between-defaultdependencycollector-and-projectdependencyresolver

On Mon, Feb 10, 2020 at 3:05 PM Tomo Suzuki <su...@google.com> wrote:
>
> I created a test case to demonstrate this behavior:
> https://github.com/suztomo/maven-provided-scope/blob/master/src/test/java/suztomo/AppTest.java#L72
>
> On Fri, Feb 7, 2020 at 5:36 PM Tomo Suzuki <su...@google.com> wrote:
> >
> > Hi Maven developers,
> >
> > I find DefaultDependencyCollector is not getting "direct" and
> > "provided" dependencies by default. Is this expected behavior?
> >
> > Background:
> > We use maven-resolver in our Java code. We create
> > RepositorySystemSesison through MavenRepositorySystemUtils.newSession
> > [1]. We use the session and DefaultDependencyCollector through
> > RepositorySystem.collectDependencies [2] to get the dependency graph
> > of a Maven artifact.
> >
> > Problem:
> > The dependency graph from RepositorySystem.collectDependencies does
> > not have direct provided dependencies. I expect provided dependencies
> > should be included in the graph when they are direct dependencies.
> >
> > Analysis:
> > - MavenRepositorySystemUtils.newSession [3] creates
> > ScopedDependencySelector("test", "provided")
> > - ScopeDependencySelector.deriveChildSelector [4] creates clone of
> > itself with transitive=true. When transitive=true, it does not select
> > "provided" dependency.
> > - DefaultDependencyCollector.collectDependencies [5] always call
> > deriveChildSelector before using the selector from the session.
> > - Therefore, ScopeDependencySelector always has transitive=true ( to
> > exclude provided dependencies) when it's used with
> > DefaultDependencyCollector.
> >
> > [1]: https://github.com/GoogleCloudPlatform/cloud-opensource-java/blob/50da79355e042c5ff14ec72230cc6edbddcf8436/dependencies/src/main/java/com/google/cloud/tools/opensource/dependencies/RepositoryUtility.java#L112
> > [2]: https://github.com/GoogleCloudPlatform/cloud-opensource-java/blob/50da79355e042c5ff14ec72230cc6edbddcf8436/dependencies/src/main/java/com/google/cloud/tools/opensource/dependencies/DependencyGraphBuilder.java#L179
> > [3]: https://github.com/apache/maven/blob/master/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java#L102
> > [4]: https://github.com/apache/maven-resolver/blob/47edcfe69c4e52ced4cb93d65b7348b5645cdd68/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java#L119
> > [5]: https://github.com/apache/maven-resolver/blob/18dd2b5cde851256a9f44db25097efee0691d6b4/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java#L255
> >
> > --
> > Regards,
> > Tomo
>
>
>
> --
> Regards,
> Tomo



-- 
Regards,
Tomo

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: [maven-resolver] DefaultDependencyCollector not collecting direct provided dependencies

Posted by Tomo Suzuki <su...@google.com.INVALID>.
I created a test case to demonstrate this behavior:
https://github.com/suztomo/maven-provided-scope/blob/master/src/test/java/suztomo/AppTest.java#L72

On Fri, Feb 7, 2020 at 5:36 PM Tomo Suzuki <su...@google.com> wrote:
>
> Hi Maven developers,
>
> I find DefaultDependencyCollector is not getting "direct" and
> "provided" dependencies by default. Is this expected behavior?
>
> Background:
> We use maven-resolver in our Java code. We create
> RepositorySystemSesison through MavenRepositorySystemUtils.newSession
> [1]. We use the session and DefaultDependencyCollector through
> RepositorySystem.collectDependencies [2] to get the dependency graph
> of a Maven artifact.
>
> Problem:
> The dependency graph from RepositorySystem.collectDependencies does
> not have direct provided dependencies. I expect provided dependencies
> should be included in the graph when they are direct dependencies.
>
> Analysis:
> - MavenRepositorySystemUtils.newSession [3] creates
> ScopedDependencySelector("test", "provided")
> - ScopeDependencySelector.deriveChildSelector [4] creates clone of
> itself with transitive=true. When transitive=true, it does not select
> "provided" dependency.
> - DefaultDependencyCollector.collectDependencies [5] always call
> deriveChildSelector before using the selector from the session.
> - Therefore, ScopeDependencySelector always has transitive=true ( to
> exclude provided dependencies) when it's used with
> DefaultDependencyCollector.
>
> [1]: https://github.com/GoogleCloudPlatform/cloud-opensource-java/blob/50da79355e042c5ff14ec72230cc6edbddcf8436/dependencies/src/main/java/com/google/cloud/tools/opensource/dependencies/RepositoryUtility.java#L112
> [2]: https://github.com/GoogleCloudPlatform/cloud-opensource-java/blob/50da79355e042c5ff14ec72230cc6edbddcf8436/dependencies/src/main/java/com/google/cloud/tools/opensource/dependencies/DependencyGraphBuilder.java#L179
> [3]: https://github.com/apache/maven/blob/master/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java#L102
> [4]: https://github.com/apache/maven-resolver/blob/47edcfe69c4e52ced4cb93d65b7348b5645cdd68/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java#L119
> [5]: https://github.com/apache/maven-resolver/blob/18dd2b5cde851256a9f44db25097efee0691d6b4/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java#L255
>
> --
> Regards,
> Tomo



-- 
Regards,
Tomo

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org