kordamp / kordamp-gradle-plugins

A collection of Gradle plugins
https://kordamp.org/kordamp-gradle-plugins/
Apache License 2.0
138 stars 25 forks source link

NPE in PluginPlugin.groovy#L81 when #510

Closed timtebeek closed 1 year ago

timtebeek commented 1 year ago

https://github.com/kordamp/kordamp-gradle-plugins/blob/master/plugins/plugin-gradle-plugin/src/main/groovy/org/kordamp/gradle/plugin/plugin/PluginPlugin.groovy#L81

Appologies, this could be rather niche, but bear with me, it's for a good cause. :sweat_smile:

When running a build of jreleaser, with a Gradle init script, which adds a plugin, that leads to a NPE in PluginPlugin.groovy#L81.

Line 81 does quite a few things, and it's not immediately clear to me what part exactly is throwing the NPE. And my fairly limited exposure to Gradle so far is making it hard for me to learn more or debug this properly.

                t.declarations.set(project.extensions.findByType(GradlePluginDevelopmentExtension).plugins)

Here's the full stacktrace.

org.gradle.api.plugins.InvalidPluginException: An exception occurred applying plugin request [id: 'org.kordamp.gradle.plugin']
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.exceptionOccurred(DefaultPluginRequestApplicator.java:198)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugin(DefaultPluginRequestApplicator.java:180)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.lambda$applyPlugins$1(DefaultPluginRequestApplicator.java:125)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:125)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:121)
 ...
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin 'org.kordamp.gradle.plugin'.
        at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:163)
        at org.gradle.api.internal.plugins.DefaultPluginManager.apply(DefaultPluginManager.java:127)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.lambda$applyPlugins$0(DefaultPluginRequestApplicator.java:127)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugin(DefaultPluginRequestApplicator.java:176)
        ... 140 more
Caused by: org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreationException: Could not create task ':jdks-gradle-plugin:listPluginDescriptors'.
        at org.gradle.api.internal.tasks.DefaultTaskContainer.taskCreationException(DefaultTaskContainer.java:719)
        at org.gradle.api.internal.tasks.DefaultTaskContainer.access$600(DefaultTaskContainer.java:77)
        at org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreatingProvider.domainObjectCreationException(DefaultTaskContainer.java:711)
        at org.gradle.api.internal.DefaultNamedDomainObjectCollection$AbstractDomainObjectCreatingProvider.tryCreate(DefaultNamedDomainObjectCollection.java:948)
        at org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreatingProvider.access$1401(DefaultTaskContainer.java:658)
...
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
        at org.gradle.api.internal.plugins.DefaultPluginManager.lambda$doApply$0(DefaultPluginManager.java:157)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:43)
        at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:156)
        ... 143 more
Caused by: java.lang.NullPointerException
        at org.kordamp.gradle.plugin.plugin.PluginPlugin$1.execute(PluginPlugin.groovy:81)
        at org.kordamp.gradle.plugin.plugin.PluginPlugin$1.execute(PluginPlugin.groovy)
        at org.gradle.api.internal.DefaultMutationGuard$2.execute(DefaultMutationGuard.java:44)
        at org.gradle.api.internal.DefaultMutationGuard$2.execute(DefaultMutationGuard.java:44)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:100)
        at org.gradle.api.internal.DefaultCollectionCallbackActionDecorator$BuildOperationEmittingAction$1.run(DefaultCollectionCallbackActionDecorator.java:95)
        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$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
        at org.gradle.api.internal.DefaultCollectionCallbackActionDecorator$BuildOperationEmittingAction.execute(DefaultCollectionCallbackActionDecorator.java:92)
        at org.gradle.internal.ImmutableActionSet$SetWithManyActions.execute(ImmutableActionSet.java:329)
        at org.gradle.api.internal.DefaultDomainObjectCollection.doAdd(DefaultDomainObjectCollection.java:264)
        at org.gradle.api.internal.DefaultNamedDomainObjectCollection.doAdd(DefaultNamedDomainObjectCollection.java:113)
        at org.gradle.api.internal.DefaultDomainObjectCollection.add(DefaultDomainObjectCollection.java:258)
        at org.gradle.api.internal.DefaultNamedDomainObjectCollection$AbstractDomainObjectCreatingProvider.tryCreate(DefaultNamedDomainObjectCollection.java:944)
        ... 198 more

The goal here is to fix the import of jreleaser into public.moderne.io, so I can more easily run recipes to improve the code base, and hopefully (still) resolve some of the Sonar issues found there recently. So any help appreciated & hopefully repaid! :)

aalmiray commented 1 year ago

Hi @timtebeek, could you let me know which version of Gradle and JDK are you using?

Also FWIW the JReleaser plugins consume v0.46.6 of the KGP which is coming from the gradle6 branch.

timtebeek commented 1 year ago

Absolutely; sorry for not including that immediately; I'm using sdk use java 11.0.17-tem for my JDK, and running the included Gradle wrapper 6.9.3.

aalmiray commented 1 year ago

Well this is weird. When the suggested init script is applied the jdks-gradle-plugin is no longer configured as expected as the gradlePlugin extension is not available and thus making the following expressions evaluate to null: project.project.extensions.findByType(GradlePluginDevelopmentExtension) .

timtebeek commented 1 year ago

Glad to see you found a way around the problem with your commit! I'll keep an eye on how the next release of kordamp-gradle-plugins affects our use of init.gradle once adopted into jreleaser. Thanks for the help!

aalmiray commented 1 year ago

v0.46.7 will be released later this week. Once it happens I’ll update the JReleaser build and let you know when ready.

aalmiray commented 1 year ago

FWIW I think the cause of this issue is the eager evaluation of tasks to be filtered. I saw such code in the init script.

timtebeek commented 1 year ago

Thanks! I've passed your comment along to hopefully get that sorted on our end. I'm learning a lot still. :)

aalmiray commented 1 year ago

v0.46.7 is out and JReleaser has it configured https://github.com/jreleaser/jreleaser/commit/36dbf943292b4ad50505a182b70ab0ed29c8d6f6

timtebeek commented 1 year ago

Thank you for the quick work on that one! Before the new plugin ingestion on our end failed with the above error after 2 minutes. After the new plugin we get up to 14 minutes of tasks being executed before it ultimately fails on our end.

Task :jreleaser-graalvm-sdk:compileJava FAILED /home/ubuntu/jenkins-agent/workspace/ingest/jreleaser_jreleaser/sdks/jreleaser-graalvm-sdk/src/main/java/org/jreleaser/graalvm/sdk/signing/BouncyCastleFeature.java:21: error: cannot access org.graalvm.nativeimage.hosted.Feature import org.graalvm.nativeimage.hosted.Feature; ^ bad class file: /home/ubuntu/.gradle/caches/modules-2/files-2.1/org.graalvm.sdk/graal-sdk/22.3.0/83179e3310a2ece87266923fede5ef7355c68c9a/graal-sdk-22.3.0.jar(org/graalvm/nativeimage/hosted/Feature.class) class file has wrong version 55.0, should be 52.0 Please remove or make sure it appears in the correct subdirectory of the classpath.

Which is weird, because we have the project configured to use Java 8. Either way, that's something for us to debug; thanks for helping out!

As you saw I managed to create https://github.com/jreleaser/jreleaser/pull/1169 by hand, so at least for now I don't think there's an immediate need for other recipes to run. Let me know if you'd like to include anything else! :)

aalmiray commented 1 year ago

JReleaser's build requires Java 11.

I thought we had removed the BouncyCastleFeature class as the Feature annotation is deprecated. Will have to double check.

And one more thing: thank you for the PR. I left one small comment I hope you can address before merging.

timtebeek commented 1 year ago

Ah that's good to know; bumped the ingestion to Java 11 just now and will try again! The BouncyCastleFeature class is still there, although it sound like you're on it already. :) And I hadn't seen any comments on https://github.com/jreleaser/jreleaser/pull/1169 yet; is that still a draft? Happy to update it.

aalmiray commented 1 year ago

Now I remember. The BouncyCastleFeature class is indeed required, what changed is how it was registered. It previously used an annotation that has been deprecated. This is one of the reasons for the build requiring Java 11.

Also, noticed the comment I left at https://github.com/jreleaser/jreleaser/pull/1169 was in pending state. It should be visible now.