diff --git a/lombok-plugin/src/main/java/io/freefair/gradle/plugins/lombok/LombokPlugin.java b/lombok-plugin/src/main/java/io/freefair/gradle/plugins/lombok/LombokPlugin.java index 5c736354..b3626e2a 100644 --- a/lombok-plugin/src/main/java/io/freefair/gradle/plugins/lombok/LombokPlugin.java +++ b/lombok-plugin/src/main/java/io/freefair/gradle/plugins/lombok/LombokPlugin.java @@ -5,15 +5,16 @@ import io.freefair.gradle.plugins.lombok.tasks.LombokConfig; import io.freefair.gradle.plugins.lombok.tasks.LombokTask; import lombok.Getter; + +import java.lang.reflect.Method; + import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Dependency; import org.gradle.api.attributes.DocsType; -import org.gradle.api.internal.plugins.DslObject; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; -import org.gradle.api.plugins.quality.CodeQualityExtension; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.PathSensitivity; @@ -47,7 +48,7 @@ public class LombokPlugin implements Plugin { private LombokBasePlugin lombokBasePlugin; private Project project; - private boolean spotbugConfigured; + private boolean spotbugsConfigured; @Override public void apply(Project project) { @@ -123,10 +124,10 @@ private void configureSourceSetDefaults(SourceSet sourceSet) { } private void configureForSpotbugs(JavaPluginExtension javaPluginExtension) { - if (spotbugConfigured) { + if (spotbugsConfigured) { return; } - spotbugConfigured = true; + spotbugsConfigured = true; javaPluginExtension.getSourceSets().all(sourceSet -> { // Use findByName: sourceSets.all also fires for source sets added later @@ -135,7 +136,7 @@ private void configureForSpotbugs(JavaPluginExtension javaPluginExtension) { .findByName(sourceSet.getCompileOnlyConfigurationName()); if (compileOnly != null) { compileOnly.withDependencies(deps -> { - String toolVersion = resolveSpotBugVersion(); + String toolVersion = resolveSpotbugsVersion(); deps.add(project.getDependencies().create( "com.github.spotbugs:spotbugs-annotations:" + toolVersion )); @@ -144,18 +145,40 @@ private void configureForSpotbugs(JavaPluginExtension javaPluginExtension) { }); } - private String resolveSpotBugVersion() { + private String resolveSpotbugsVersion() { if (!project.getPlugins().hasPlugin("com.github.spotbugs")) { return SPOTBUGS_DEFAULT_VERSION; } - Object spotbugsExtension = project.getExtensions().getByName("spotbugs"); - if (spotbugsExtension instanceof CodeQualityExtension) { - return ((CodeQualityExtension) spotbugsExtension).getToolVersion(); + Object spotbugsExtension; + try { + spotbugsExtension = project.getExtensions().getByName("spotbugs"); + } catch (Exception e) { + project.getLogger().info("Could not find SpotBugs extension; falling back to {}", SPOTBUGS_DEFAULT_VERSION); + return SPOTBUGS_DEFAULT_VERSION; + } + + try { + Method method = spotbugsExtension.getClass().getMethod("getToolVersion"); + Object result = method.invoke(spotbugsExtension); + if (result instanceof Property) { + @SuppressWarnings("unchecked") + Property toolVersionProperty = (Property) result; + String resolved = toolVersionProperty.getOrElse(SPOTBUGS_DEFAULT_VERSION); + return resolved.isBlank() ? SPOTBUGS_DEFAULT_VERSION : resolved; + } else if (result instanceof String version && !version.isBlank()) { + return version; + } else { + project.getLogger().debug("resolveSpotbugsVersion: getToolVersion() returned unexpected type {}; using default {}", + result == null ? "null" : result.getClass().getName(), SPOTBUGS_DEFAULT_VERSION); + } + } catch (ReflectiveOperationException | RuntimeException e) { + Throwable cause = e.getCause() != null ? e.getCause() : e; + project.getLogger().info("Could not resolve SpotBugs tool version via reflection ({}); falling back to {}", + cause.getMessage(), SPOTBUGS_DEFAULT_VERSION); } - Property toolVersionProperty = (Property) new DslObject(spotbugsExtension).getAsDynamicObject().getProperty("toolVersion"); - return toolVersionProperty.get(); + return SPOTBUGS_DEFAULT_VERSION; } private void configureDelombokDefaults(Delombok delombok) {