You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "Tomo Suzuki (JIRA)" <ji...@apache.org> on 2019/08/16 17:00:00 UTC

[jira] [Created] (MNG-6737) StackOverflowError when version ranges are unsolvable unsolvable and graph contains a cycle

Tomo Suzuki created MNG-6737:
--------------------------------

             Summary: StackOverflowError when version ranges are unsolvable unsolvable and graph contains a cycle
                 Key: MNG-6737
                 URL: https://issues.apache.org/jira/browse/MNG-6737
             Project: Maven
          Issue Type: Improvement
    Affects Versions: 3.6.1
            Reporter: Tomo Suzuki


Maven throws StackOverflowError when version ranges are unsolvable and the dependency graph contains a cycle.

 
{code:java}
[INFO] --------------------------< suztomo:module-c >--------------------------
[INFO] Building module-c 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.406 s
[INFO] Finished at: 2019-08-16T12:10:30-04:00
[INFO] ------------------------------------------------------------------------
...
Exception in thread "main" java.lang.StackOverflowError
	at org.eclipse.aether.graph.DefaultDependencyNode.accept(DefaultDependencyNode.java:341)
	at org.eclipse.aether.graph.DefaultDependencyNode.accept(DefaultDependencyNode.java:345)
	at org.eclipse.aether.graph.DefaultDependencyNode.accept(DefaultDependencyNode.java:345)
	at org.eclipse.aether.graph.DefaultDependencyNode.accept(DefaultDependencyNode.java:345)
	at org.eclipse.aether.graph.DefaultDependencyNode.accept(DefaultDependencyNode.java:345)
	at org.eclipse.aether.graph.DefaultDependencyNode.accept(DefaultDependencyNode.java:345)
...(omitting many lines)...
{code}
 
h1. Example 

Example project to reproduce the issue:  [https://github.com/suztomo/maven-cyclic-dependency-with-range]

 

 
h1. Diagnosis

In the example above, because of a version conflict on grpc-core (1.21.0 v.s. 1.16.1),
[org.eclipse.aether.util.graph.transformer.NearestVersionSelector.newFailure|https://github.com/apache/maven-resolver/blob/maven-resolver-1.4.0/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/NearestVersionSelector.java#L158] tries to throw UnsolvableVersionConflictExceptoin. However, before throwing the exception PathRecordingDependencyVisitor visits nodes in the dependency graph and the graph contains a cycle. The visitor goes to infinite recursion in visiting the cyclic path, resulting in StackOverflowError.



private UnsolvableVersionConflictException newFailure( final ConflictContext context )
 {
 ...
 PathRecordingDependencyVisitor visitor = new PathRecordingDependencyVisitor( filter );
 context.getRoot().accept( visitor );
 return new UnsolvableVersionConflictException( visitor.getPaths() );
 }


The cyclic path consists of module-a and module-b as illustrated below:


{code:java}
module-c:1.0.0
+- module-b:2.0.0
 +- module-a:1.0.0
 +- module-b:0.0.1
 +- module-b:1.0.0
 | +- module-a:1.0.0
 | +- module-b:0.0.1
 | +- module-b:1.0.0
   ...{code}
 



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)