Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

StackOverflowError on attempt to run against import dependencies #4093

Open
ZhyliaievD opened this issue Mar 14, 2024 · 2 comments
Open

StackOverflowError on attempt to run against import dependencies #4093

ZhyliaievD opened this issue Mar 14, 2024 · 2 comments
Labels
bug Something isn't working

Comments

@ZhyliaievD
Copy link

ZhyliaievD commented Mar 14, 2024

Hi,

maven-rewrite-plugin fails with java.lang.StackOverflowError when there is a dependency with import scope having a parent declaration
org.openrewrite.maven.tree.ResolvedPom tries to resolve parent of such dependency, which in turn contains the dependency itself, resulting in circular dependency
Of course, that's a clear problem in target project, but it is ignored by maven during build process so people can easily miss it

What version of OpenRewrite are you using?

latest version of rewrite-maven-plugin (5.25.0)

What is the smallest, simplest way to reproduce the problem?

Run any recipe against a sample project:
https://github.com/ZhyliaievD/rewrite-maven-plugin-soe-sample
e.g. sample command to run:
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.activeRecipes=org.openrewrite.java.RemoveUnusedImports

OR use the following code snippets to reproduce using the following parent&child poms:

project structure:

/pom.xml.  <-- parent pom
/circular-example-child/pom.xml  <-- child pom

Parent pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>circular-example</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>circular-example</name>
  <url>http://maven.apache.org</url>

  <modules>
    <module>circular-example-child</module>
  </modules>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.example</groupId>
        <artifactId>circular-example-child</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

child pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.example</groupId>
    <artifactId>circular-example</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>circular-example-child</artifactId>
  <version>1.0-SNAPSHOT</version>
</project>

What did you expect to see?

a) plugin taking care of such cases
b) plugin throwing meaningful exception stating about circular dependencies in project

What did you see instead?

...
[INFO] Project [circular-example] Resolving Poms...
Exception in thread "main" java.lang.StackOverflowError
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.mergeProperties(ResolvedPom.java:701)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentPropertiesAndRepositoriesRecursively(ResolvedPom.java:388)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentsRecursively(ResolvedPom.java:357)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolve(ResolvedPom.java:346)
        at org.openrewrite.maven.tree.ResolvedPom.resolve(ResolvedPom.java:168)
        at org.openrewrite.maven.tree.Pom.resolve(Pom.java:120)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.mergeDependencyManagement(ResolvedPom.java:725)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentDependenciesRecursively(ResolvedPom.java:423)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentDependenciesRecursively(ResolvedPom.java:441)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentsRecursively(ResolvedPom.java:375)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolve(ResolvedPom.java:346)
        at org.openrewrite.maven.tree.ResolvedPom.resolve(ResolvedPom.java:168)
        at org.openrewrite.maven.tree.Pom.resolve(Pom.java:120)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.mergeDependencyManagement(ResolvedPom.java:725)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentDependenciesRecursively(ResolvedPom.java:423)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentDependenciesRecursively(ResolvedPom.java:441)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentsRecursively(ResolvedPom.java:375)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolve(ResolvedPom.java:346)
        at org.openrewrite.maven.tree.ResolvedPom.resolve(ResolvedPom.java:168)
        at org.openrewrite.maven.tree.Pom.resolve(Pom.java:120)
        ........
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.mergeDependencyManagement(ResolvedPom.java:725)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentDependenciesRecursively(ResolvedPom.java:423)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentDependenciesRecursively(ResolvedPom.java:441)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentsRecursively(ResolvedPom.java:375)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolve(ResolvedPom.java:346)
        at org.openrewrite.maven.tree.ResolvedPom.resolve(ResolvedPom.java:168)
        at org.openrewrite.maven.tree.Pom.resolve(Pom.java:120)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.mergeDependencyManagement(ResolvedPom.java:725)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentDependenciesRecursively(ResolvedPom.java:423)
        at org.openrewrite.maven.tree.ResolvedPom$Resolver.resolveParentDependenciesRecursively(ResolvedPom.java:441)
@ZhyliaievD ZhyliaievD added the bug Something isn't working label Mar 14, 2024
@timtebeek
Copy link
Contributor

Hi @ZhyliaievD ; thanks for the report! Hadn't expected this type of use indeed. Is that a common case over there?
The classes involved here are all in openrewrite/rewrite, so I'll move the issue for a likely fix in that project.

@timtebeek timtebeek transferred this issue from openrewrite/rewrite-maven-plugin Mar 14, 2024
@ZhyliaievD
Copy link
Author

Not really a common case, but a mistake in existing project(actually, it was a problem in shared library, so all projects using that lib version were affected - may be not that fast to fix on scale in such cases)
The problem is that bug is hidden by maven during build process, so user receives StackOverflowError on a "green" repo, making openrewrite first thing to blame. It takes decent amout of time to investigate and find a real rootcause

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
Status: Backlog
Development

No branches or pull requests

2 participants