jeremymailen / kotlinter-gradle

Painless, fast ktlint plugin for Gradle
Apache License 2.0
562 stars 50 forks source link

Kotlinter crashes with NoSuchMethodError in Sarif4K 0.6.0 #382

Open rock3r opened 3 weeks ago

rock3r commented 3 weeks ago

When running check, the plugin crashes:

java.lang.NoSuchMethodError: 'void io.github.detekt.sarif4k.ToolComponent.<init>(io.github.detekt.sarif4k.ToolComponentReference, java.util.List, java.lang.String, java.lang.String, io.github.detekt.sarif4k.MultiformatMessageString, java.lang.String, java.util.Map, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.String, java.lang.String, java.util.List, java.lang.String, java.lang.String, java.util.List, java.lang.String, java.lang.String, java.lang.String, io.github.detekt.sarif4k.PropertyBag, java.lang.String, java.util.List, java.lang.String, io.github.detekt.sarif4k.MultiformatMessageString, java.util.List, java.util.List, io.github.detekt.sarif4k.TranslationMetadata, java.lang.String, int, kotlin.jvm.internal.DefaultConstructorMarker)'
    at com.pinterest.ktlint.cli.reporter.sarif.SarifReporter.afterAll(SarifReporter.kt:95)
    at org.jmailen.gradle.kotlinter.support.SortedThreadSafeReporterWrapper.afterAll(SortedThreadSafeReporterWrapper.kt:63)
    at org.jmailen.gradle.kotlinter.tasks.lint.LintWorkerAction.execute(LintWorkerAction.kt:60)
    at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
    at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
    at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
    at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
    at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
    at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
    at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
    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:166)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
    at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
    at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
    at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:187)
    at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:120)
    at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:162)
    at org.gradle.internal.Factories$1.create(Factories.java:31)
    at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:264)
    at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:128)
    at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:133)
    at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:157)
    at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:126)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:840)

Downgrading Sarif4K to 0.5.0 works fine. You probably just need to upgrade your dependency.

jeremymailen commented 3 weeks ago

Thank you for the report. I don't believe we have a direct dependency on sarif, but get it through com.pinterest.ktlint:ktlint-cli-reporter-sarif:1.2.1. Seems like we should add automated test coverage however.

What's your gradle configuration? Sarif reports work for me using the latest version of kotlinter (4.3.0). Have you bumped the ktlint dependency? I still need to put out a new release supporting 1.3.0.

rock3r commented 3 weeks ago

Hi Jeremy! I had this crash when working on https://github.com/JetBrains/jewel/pull/398, where I initially updated Sarif4k to 0.6.0. I am not declaring the ktlint version explicitly, just getting whatever comes through your plugin

jeremymailen commented 3 weeks ago

I see. It sounds like maybe the jetbrains compose build plugin for that one requires a later version of the sarif dependency. If you remove the other build plugin, do sarif reports work?

It's an unfortunate challenge that the dependencies are not isolated when it comes to gradle plugins, which you can see from the compatibility matrix described by this plugin which isn't comprehensive. There might be other plugins out there with conflicting dependencies.

rock3r commented 3 weeks ago

I have only tried a simple "roll back the Sarif4k version to 0.5.0" and stopped there, since that fixed the issue. I have a direct dependency on it because I need to merge Sarif reports before uploading to GH Actions; I don't think any 3p plugin in my build uses it — apart maybe from Detekt, but that is not problematic, since it's my direct dependency that causes issues.

rock3r commented 3 weeks ago

https://github.com/JetBrains/jewel/blob/main/buildSrc/src/main/kotlin/MergeSarifTask.kt is the code that uses Sarif4k, for the record