rewrite: Caused by: java.lang.RuntimeException: Error while visiting build.gradle: java.lang.IllegalStateException: CompilationFailedException

What version of OpenRewrite are you using?

I am using:

  • Gradle plugin v6.3.8
  • Gradle 7.6
  • rewrite-spring v5.0.10

How are you running OpenRewrite?

I am using the Gradle plugin through an init script, my project is a single module project.

initscript {
    repositories {
        maven { url "https://plugins.gradle.org/m2" }
    }
    dependencies { classpath("org.openrewrite:plugin:6.3.8") }
}
rootProject {
    plugins.apply(org.openrewrite.gradle.RewritePlugin)
    dependencies {
        rewrite("org.openrewrite.recipe:rewrite-spring:5.0.10") // I also tried 5.0.8
    }
    rewrite {
        activeRecipe("org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_1") // I also tried going to 3_0 first
    }
    afterEvaluate {
        if (repositories.isEmpty()) {
            repositories {
                mavenCentral()
            }
        }
    }
}

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

I will come back to this, my build.gradle is very simple and I’ve tried removing most of everything from the file to eliminate the problem but nothing seems to change the problem.

What is the full stack trace of any errors you encountered?

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':rewriteRun'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:142)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:140)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:128)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:69)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:309)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:302)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:288)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:462)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:379)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: Error while visiting build.gradle: java.lang.IllegalStateException: CompilationFailedException: org.codehaus.groovy.control.CompilationFailedException: parsing failed
  org.apache.groovy.parser.antlr4.AstBuilder.createParsingFailedException(AstBuilder.java:4315)
  org.apache.groovy.parser.antlr4.AstBuilder.convertException(AstBuilder.java:259)
  org.apache.groovy.parser.antlr4.AstBuilder.buildCST(AstBuilder.java:235)
  org.apache.groovy.parser.antlr4.AstBuilder.buildAST(AstBuilder.java:269)
  org.apache.groovy.parser.antlr4.Antlr4ParserPlugin.buildAST(Antlr4ParserPlugin.java:58)
  org.codehaus.groovy.control.SourceUnit.buildAST(SourceUnit.java:256)
  java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
  java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
  ...
  org.openrewrite.gradle.AddDependencyVisitor$InsertDependencyInOrder.visitMethodInvocation(AddDependencyVisitor.java:263)
  org.openrewrite.gradle.AddDependencyVisitor$InsertDependencyInOrder.visitMethodInvocation(AddDependencyVisitor.java:209)
  org.openrewrite.java.tree.J$MethodInvocation.acceptJava(J.java:3723)
  org.openrewrite.java.tree.J.accept(J.java:59)
  org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
  org.openrewrite.TreeVisitor.visitAndCast(TreeVisitor.java:361)
  org.openrewrite.groovy.GroovyVisitor.lambda$visitCompilationUnit$0(GroovyVisitor.java:47)
  org.openrewrite.internal.ListUtils.map(ListUtils.java:176)
  ...
        at org.openrewrite.gradle.DelegatingProjectParser.unwrapInvocationException(DelegatingProjectParser.java:155)
        at org.openrewrite.gradle.DelegatingProjectParser.run(DelegatingProjectParser.java:99)
        at org.openrewrite.gradle.RewriteRunTask.run(RewriteRunTask.java:38)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:236)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:221)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:204)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:187)
        at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:165)
        at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
        at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.executeDelegateBroadcastingChanges(CaptureStateAfterExecutionStep.java:124)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:80)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:58)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:181)
        at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:71)
        at org.gradle.internal.Either$Right.fold(Either.java:175)
        at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:69)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:47)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:110)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:102)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNoEmptySources(SkipEmptyWorkStep.java:254)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:91)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:56)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
        at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:281)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
        at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:139)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:128)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:69)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:309)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:302)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:288)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:462)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:379)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: java.lang.RuntimeException: Error while visiting build.gradle: java.lang.IllegalStateException: CompilationFailedException: org.codehaus.groovy.control.CompilationFailedException: parsing failed
  org.apache.groovy.parser.antlr4.AstBuilder.createParsingFailedException(AstBuilder.java:4315)
  org.apache.groovy.parser.antlr4.AstBuilder.convertException(AstBuilder.java:259)
  org.apache.groovy.parser.antlr4.AstBuilder.buildCST(AstBuilder.java:235)
  org.apache.groovy.parser.antlr4.AstBuilder.buildAST(AstBuilder.java:269)
  org.apache.groovy.parser.antlr4.Antlr4ParserPlugin.buildAST(Antlr4ParserPlugin.java:58)
  org.codehaus.groovy.control.SourceUnit.buildAST(SourceUnit.java:256)
  java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
  java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
  ...
  org.openrewrite.gradle.AddDependencyVisitor$InsertDependencyInOrder.visitMethodInvocation(AddDependencyVisitor.java:263)
  org.openrewrite.gradle.AddDependencyVisitor$InsertDependencyInOrder.visitMethodInvocation(AddDependencyVisitor.java:209)
  org.openrewrite.java.tree.J$MethodInvocation.acceptJava(J.java:3723)
  org.openrewrite.java.tree.J.accept(J.java:59)
  org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
  org.openrewrite.TreeVisitor.visitAndCast(TreeVisitor.java:361)
  org.openrewrite.groovy.GroovyVisitor.lambda$visitCompilationUnit$0(GroovyVisitor.java:47)
  org.openrewrite.internal.ListUtils.map(ListUtils.java:176)
  ...
        at org.openrewrite.gradle.isolated.ResultsContainer$1.lambda$preVisit$0(ResultsContainer.java:115)
        at org.openrewrite.gradle.isolated.ResultsContainer$1.preVisit(ResultsContainer.java:112)
        at org.openrewrite.gradle.isolated.ResultsContainer$1.preVisit(ResultsContainer.java:108)
        at org.openrewrite.gradle.isolated.ResultsContainer_1_GroovyVisitor.preVisit(ResultsContainer_1_GroovyVisitor.zig:81)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:275)
        at org.openrewrite.TreeVisitor.visitAndCast(TreeVisitor.java:361)
        at org.openrewrite.groovy.GroovyVisitor.lambda$visitCompilationUnit$0(GroovyVisitor.java:47)
        at org.openrewrite.internal.ListUtils.map(ListUtils.java:176)
        at org.openrewrite.groovy.GroovyVisitor.visitCompilationUnit(GroovyVisitor.java:47)
        at org.openrewrite.groovy.tree.G$CompilationUnit.acceptGroovy(G.java:182)
        at org.openrewrite.groovy.tree.G.accept(G.java:43)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
        at org.openrewrite.gradle.isolated.ResultsContainer.getRecipeErrors(ResultsContainer.java:119)
        at org.openrewrite.gradle.isolated.ResultsContainer.getFirstException(ResultsContainer.java:99)
        at org.openrewrite.gradle.isolated.DefaultProjectParser.run(DefaultProjectParser.java:403)
        at org.openrewrite.gradle.isolated.DefaultProjectParser.run(DefaultProjectParser.java:397)
        at org.openrewrite.gradle.DelegatingProjectParser.lambda$run$2(DelegatingProjectParser.java:100)
        at org.openrewrite.gradle.DelegatingProjectParser.unwrapInvocationException(DelegatingProjectParser.java:147)
        ... 118 more

Are you interested in contributing a fix to OpenRewrite?

About this issue

  • Original URL
  • State: open
  • Created 9 months ago
  • Comments: 16 (16 by maintainers)

Most upvoted comments

So I’m going to break this down in a few steps…

  1. The Jaxb and Jaxws recipes both look at all of the configurations to find any that have their respective API dependencies. Then minimize those configurations to the lowest common denominators possible (ie. Try to add the fewest possible dependency declarations much like a developer would).

  2. Based on what I see in your screenshot, you’re using Jaxb and Jaxws in your main source code (or at least the recipe seems to think this). So as such it adds the runtime dependency as a compileOnly and testImplementation, as it’s most likely that you’re going to be deploying into an JavaEE container that brings the dependency for you. It’s also likely that there are tests which will require the runtime to operate.

  3. The default and rewrite configurations are consumable, but don’t extend from anything. So what’s puzzling is why the recipe is identifying that the Jaxb’s API is available here unless something is putting it there specifically. My most likely suspect is there is a misbehaving plugin that is pushing the Jaxb API dependency into all configurations in the project which then results in it existing in the default and rewrite configurations kind of mysteriously and then the recipe makes the changes shown on this issue. Due to the potential existence of said plugin explains perfectly why Tim is unable to replicate the behavior via a test. Given you seem pretty ready to dive way in, you can continue to add the plugins from your project to Tim’s test until it reproduces your error. Unfortunately, it’s not going to be something readily fixable in OpenRewrite.

  4. As far as the default dependency configuration itself, for Groovy 3 it would probably have to be wrapped in quotes. However, as you’ve discovered the groovy parser I don’t believe yet supports string quoted method names. Quoted method names in Groovy often only appear in test code rather than in main code, so that likely is the reason why these haven’t been addressed yet. The most common place that I’ve seen quoted methods are in Spockframework tests and these are unparseable for a large number of reasons before we even make it to a test method itself. Lastly, taken directly from the Gradle documentation:

default

A fallback configuration used when dependency resolution is performed without request attributes.

New builds and plugins should not be using the default configuration! It remains solely for backwards compatibility. Dependency resolution should be performed with request attributes.

Source: https://docs.gradle.org/current/userguide/base_plugin.html#sec:base_plugin_configurations

So at least to me, it feels like OpenRewrite doesn’t and shouldn’t need to do anything special for the default configuration given that it shouldn’t be used in a Gradle dependency world.

@timtebeek I do prefer the init script approach but it causes the same problem as the modification of build.gradle, it was just easier to write a test case that used the build.gradle modifications. This really probably isn’t a big deal though, anyone modifying their own build.gradle or understanding gradle enough to prefer the init script approach should see pretty clearly what is going on and just remove the changes.

I started looking at AddJaxbRuntime in rewrite-migrate-java and came up with this test that duplicates the rewrite configuration behavior:

@Test
    @Issue("https://github.com/openrewrite/rewrite/issues/3559")
    void addJaxbRuntimeToTransitiveGradleConfigurations() {
        rewriteRun(
          spec -> spec.beforeRecipe(withToolingApi()),
          buildGradle(
            //language=gradle
            """
              plugins {
                  id 'java'
                  id 'org.springframework.boot' version '2.7.16'
                  id 'io.spring.dependency-management' version '1.0.15.RELEASE'
                  id("org.openrewrite.rewrite") version("6.3.6")
              }
              
              repositories {
                  mavenCentral()
              }
              
              rewrite {
                  activeRecipe("org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_1")
              }
              
              dependencies {
                  rewrite("org.openrewrite.recipe:rewrite-spring:5.0.10")
                  implementation 'org.springframework.boot:spring-boot-starter'
                  testImplementation 'org.springframework.boot:spring-boot-starter-test'
              }
              """,
            """
              plugins {
                  id 'java'
                  id 'org.springframework.boot' version '2.7.16'
                  id 'io.spring.dependency-management' version '1.0.15.RELEASE'
                  id("org.openrewrite.rewrite") version("6.3.6")
              }
                            
              repositories {
                  mavenCentral()
              }
                            
              rewrite {
                  activeRecipe("org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_1")
              }
                            
              dependencies {
                  compileOnly "org.glassfish.jaxb:jaxb-runtime:2.3.8"
                  
                  rewrite("org.openrewrite.recipe:rewrite-spring:5.0.10")
                  testImplementation "org.glassfish.jaxb:jaxb-runtime:2.3.8"
                  implementation 'org.springframework.boot:spring-boot-starter'
                  testImplementation 'org.springframework.boot:spring-boot-starter-test'
              }
              """)
        );
    }

This just makes sense given that the guide to run rewrite suggests updating the gradle build and including the dependency on the rewrite configuration. Now that I am running tests in the right place I will try and figure out what plugin or dependency causes the default configuration to be selected.