All Projects → tbroyer → Gradle Errorprone Plugin

tbroyer / Gradle Errorprone Plugin

Licence: apache-2.0
Gradle plugin to use the error-prone compiler for Java

Programming Languages

java
68154 projects - #9 most used programming language
kotlin
9241 projects

Projects that are alternatives of or similar to Gradle Errorprone Plugin

Android Snapshot Publisher
Gradle plugin to deploy Android Snapshot Versions
Stars: ✭ 145 (-28.22%)
Mutual labels:  gradle-plugin
Retropiler
PoC of Java8 Standard Library for Android for API version >= 15
Stars: ✭ 159 (-21.29%)
Mutual labels:  gradle-plugin
Maven Git Versioning Extension
This extension will virtually set project versions, based on current git branch or tag.
Stars: ✭ 178 (-11.88%)
Mutual labels:  gradle-plugin
Shortbread
Android library that creates app shortcuts from annotations
Stars: ✭ 1,803 (+792.57%)
Mutual labels:  gradle-plugin
Shipkit
Toolkit for shipping it used by Mockito library
Stars: ✭ 157 (-22.28%)
Mutual labels:  gradle-plugin
Dexguard
Android app防dex2jar的gradle插件
Stars: ✭ 174 (-13.86%)
Mutual labels:  gradle-plugin
Gradle Pitest Plugin
Gradle plugin for PIT Mutation Testing
Stars: ✭ 144 (-28.71%)
Mutual labels:  gradle-plugin
Gradle Baseline
A set of Gradle plugins that configure default code quality tools for developers.
Stars: ✭ 191 (-5.45%)
Mutual labels:  gradle-plugin
Versioning
Gradle plug-in to generate version information from the SCM branch (Git or Svn)
Stars: ✭ 157 (-22.28%)
Mutual labels:  gradle-plugin
Gradle Launch4j
A gradle-plugin to create windows executables with launch4j
Stars: ✭ 177 (-12.38%)
Mutual labels:  gradle-plugin
Gradle License Report
A plugin for generating reports about the licenses of third party software using Gradle
Stars: ✭ 152 (-24.75%)
Mutual labels:  gradle-plugin
Buildkonfig
BuildConfig for Kotlin Multiplatform Project
Stars: ✭ 156 (-22.77%)
Mutual labels:  gradle-plugin
Click Debounce
Using ASM to handle Android's click debounce, specially a quick double click.
Stars: ✭ 175 (-13.37%)
Mutual labels:  gradle-plugin
Gradle Aem Plugin
Swiss army knife for Adobe Experience Manager related automation. Environment setup & incremental AEM application build which takes seconds, not minutes.
Stars: ✭ 145 (-28.22%)
Mutual labels:  gradle-plugin
Gradle Testsets Plugin
A plugin for the Gradle build system that allows specifying test sets (like integration or acceptance tests).
Stars: ✭ 182 (-9.9%)
Mutual labels:  gradle-plugin
Moko Resources
Resources access for mobile (android & ios) Kotlin Multiplatform development
Stars: ✭ 142 (-29.7%)
Mutual labels:  gradle-plugin
Vue Kotlin
Libraries and tools supporting the use of Vue.js in Kotlin.
Stars: ✭ 162 (-19.8%)
Mutual labels:  gradle-plugin
Gradle Swagger Generator Plugin
Gradle plugin for OpenAPI YAML validation, code generation and API document publishing
Stars: ✭ 197 (-2.48%)
Mutual labels:  gradle-plugin
Jarfilterplugin
Help exclude classes before building the JAR into Android DEX archives.
Stars: ✭ 189 (-6.44%)
Mutual labels:  gradle-plugin
Gradle Avro Plugin
A Gradle plugin to allow easily performing Java code generation for Apache Avro. It supports JSON schema declaration files, JSON protocol declaration files, and Avro IDL files.
Stars: ✭ 176 (-12.87%)
Mutual labels:  gradle-plugin

gradle-errorprone-plugin

This plugin configures JavaCompile tasks to use the Error Prone compiler.

Requirements

This plugin requires using at least Gradle 5.2.

While JDK 8 is supported, it is recommended to use at least a JDK 9 compiler. See note below about JDK 8 support.

Usage

plugins {
    id("net.ltgt.errorprone") version "<plugin version>"
}

Note: snippets in this guide use features from the latest Gradle version, so beware if copy/pasting.

This plugin creates a configuration named errorprone, and configures the <sourceSet>AnnotationProcessor configuration for each source set to extend it. This allows configuring Error Prone dependencies from a single place.

Error Prone needs to be added as a dependency in this configuration:

repositories {
    mavenCentral()
}
dependencies {
    errorprone("com.google.errorprone:error_prone_core:$errorproneVersion")
}

CAUTION: Using a dynamic or changing version for Error Prone, such as latest.release or 2.+, means that your build could fail at any time, if a new version of Error Prone adds or enables new checks that your code would trigger.

Error Prone can then be configured on the JavaCompile tasks:

tasks.withType(JavaCompile).configureEach {
    options.errorprone.disableWarningsInGeneratedCode = true
}
with Kotlin DSL
import net.ltgt.gradle.errorprone.errorprone

tasks.withType<JavaCompile>().configureEach {
    options.errorprone.disableWarningsInGeneratedCode.set(true)
}

and can also be disabled altogether:

tasks.named("compileTestJava").configure {
    options.errorprone.enabled = false
}
with Kotlin DSL
tasks.named<JavaCompile>("compileTestJava") {
    options.errorprone.isEnabled.set(false)
}

Note that this plugin only enables Error Prone on tasks for source sets (i.e. compileJava for the main source set, compileTestJava for the test source set, and compileIntegTestJava for a custom integTest source set). If you're creating custom JavaCompile tasks, then you'll have to configure them manually to enable Error Prone:

tasks.register("compileCustom", JavaCompile) {
    source "src/custom/"
    include "**/*.java"
    classpath = configurations.custom
    sourceCompatibility = "8"
    targetCompatibility = "8"
    destinationDir = file("$buildDir/classes/custom")

    // Error Prone must be available in the annotation processor path
    options.annotationProcessorPath = configurations.errorprone
    // Enable Error Prone
    options.errorprone.enabled = true
    // It can then be configured for the task
    options.errorprone.disableWarningsInGeneratedCode = true
}
with Kotlin DSL
tasks.register<JavaCompile>("compileCustom") {
    source("src/custom/")
    include("**/*.java")
    classpath = configurations["custom"]
    sourceCompatibility = "8"
    targetCompatibility = "8"
    destinationDir = file("$buildDir/classes/custom")

    // Error Prone must be available in the annotation processor path
    options.annotationProcessorPath = configurations["errorprone"]
    // Enable Error Prone
    options.errorprone.isEnabled.set(true)
    // It can then be configured for the task
    options.errorprone.disableWarningsInGeneratedCode.set(true)
}

JDK 8 support

Error Prone requires at least a JDK 9 compiler. When using a JDK 8 compiler, you can configure a dependency on the Error Prone javac in the errorproneJavac configuration:

dependencies {
    errorproneJavac("com.google.errorprone:javac:9+181-r4173-1")
}

and the plugin will configure the JavaCompile tasks to use a forking compiler and will override the compiler by prepending the dependencies to the bootstrap classpath (using a -Xbootclasspath/p: JVM argument).

Starting with Gradle 6.7, you can configure JavaCompile tasks to use a specific JDK compiler, independently of the JDK used to run Gradle itself. The plugin will use the toolchain version, if any is specified, to configure the task. This allows you to enforce compilation with JDK 8 (properly configured for Error Prone!) while running Gradle with e.g. JDK 11, or the reverse: enforce compilation with JDK 11 while running Gradle with JDK 8.

Alternatively, or for previous versions of Gradle, you can configure JavaCompile tasks to use such a JDK while still using JDK 8 for running Gradle:

tasks.withType(JavaCompile).configureEach {
    options.fork(javaHome: project.getProperty("jdk11home"))
}
with Kotlin DSL
tasks.withType<JavaCompile>().configureEach {
    options.fork = true
    options.forkOptions.javaHome = project.getProperty("jdk11home")
}

The plugin will try to detect those cases and won't configure the bootstrap classpath in this case, but to play safe it will actually ignore any task that forks and defines either a javaHome or an executable (this also means that it won't configure the bootstrap classpath if you're e.g. running Gradle with a more recent JDK and forking the compilation tasks to use JDK 8).

If you need it, you can configure the bootstrap classpath manually for those tasks that the plugin would have skipped:

someTask.configure {
    // …

    inputs.files(configurations.errorproneJavac).withNormalizer(ClasspathNormalizer)
    doFirst {
        options.forkOptions.jvmArgs += "-Xbootclasspath/p:${configurations.errorproneJavac.asPath}"
    }
}
with Kotlin DSL
someTask.configure {
    // …

    inputs.files(configurations.errorproneJavac).withNormalizer(ClasspathNormalizer::class)
    doFirst {
        options.forkOptions.jvmArgs.add("-Xbootclasspath/p:${configurations["errorproneJavac"].asPath}")
    }
}

(if you're using forkOptions.executable, then use -J-Xbootclasspath/p: instead.)

Migration from versions 0.0.x

If you relied on the default Error Prone dependency (which you shouldn't have, see warning above about changing versions), you'll have to configure it explicitly (see above). If you need to support building with JDK 8, you'll need to configure the Error Prone javac dependency (see above).

Contrary to versions 0.0.x, later versions use a DSL to configure Error Prone, and passing Error Prone-specific arguments to options.compilerArgs won't work. As an easy migration step, you can pass those arguments to options.errorprone.errorproneArgs instead:

  tasks.withType(JavaCompile).configureEach {
-     options.compilerArgs << "-Xlint:all" << "-Werror" << "-XepDisableWarningsInGeneratedCode"
-     options.compilerArgs << "-Xep:NullAway:ERROR" << "-XepOpt:NullAway:AnnotatedPackages=net.ltgt"
+     options.compilerArgs << "-Xlint:all" << "-Werror"
+     options.errorprone.errorproneArgs.add("-XepDisableWarningsInGeneratedCode")
+     options.errorprone.errorproneArgs.addAll("-Xep:NullAway:ERROR", "-XepOpt:NullAway:AnnotatedPackages=com.uber")
  }

The next (optional) step would be to move to using the DSL:

  tasks.withType(JavaCompile).configureEach {
      options.compilerArgs << "-Xlint:all" << "-Werror"
-     options.errorprone.errorproneArgs.add("-XepDisableWarningsInGeneratedCode")
-     options.errorprone.errorproneArgs.addAll("-Xep:NullAway:ERROR", "-XepOpt:NullAway:AnnotatedPackages=com.uber")
+     options.errorprone {
+         disableWarningsInGeneratedCode = true
+         error("NullAway")
+         option("NullAway:AnnotatedPackages", "net.ltgt")
+     }
  }

Finally, the net.ltgt.errorprone-base plugin is removed without replacement. In most cases, it can be replaced by disabling or enabling Error Prone on selected tasks.

Custom Error Prone checks

This requires Error Prone 2.3.0 or later.

Custom Error Prone checks can be added to the errorprone configuration too:

dependencies {
    errorprone("com.uber.nullaway:nullaway:$nullawayVersion")
}

or alternatively to the <sourceSet>AnnotationProcessor configuration, if they only need to be enabled for a given source set:

dependencies {
    annotationProcessor("com.google.guava:guava-beta-checker:$betaCheckerVersion")
}

and can then be configured on the tasks; for example:

tasks.withType(JavaCompile).configureEach {
    options.errorprone {
        option("NullAway:AnnotatedPackages", "net.ltgt")
    }
}
tasks.named("compileJava").configure {
    // The check defaults to a warning, bump it up to an error for the main sources
    options.errorprone.error("NullAway")
}
with Kotlin DSL
tasks.withType<JavaCompile>().configureEach {
    options.errorprone {
        option("NullAway:AnnotatedPackages", "net.ltgt")
    }
}
tasks.named("compileJava", JavaCompile::class) {
    // The check defaults to a warning, bump it up to an error for the main sources
    options.errorprone.error("NullAway")
}

Configuration

As noted above, this plugin adds an errorprone extension to the JavaCompile.options. It can be configured either as a property (options.errorprone.xxx = …) or script block (options.errorprone { … }).

In a *.gradle.kts script, the Kotlin extensions need to be imported:

import net.ltgt.gradle.errorprone.errorprone

Properties

Please note that all properties are lazy, so while you can use = in place of .set(…) in the Groovy DSL, you cannot use << or += to add to lists for instance.

Property Description
enabled (isEnabled with Kotlin DSL) Allows disabling Error Prone altogether for the task. Error Prone will still be in the annotation processor path, but -Xplugin:ErrorProne won't be passed as a compiler argument. Defaults to true for source set tasks, false otherwise.
disableAllChecks Disable all Error Prone checks; maps to -XepDisableAllChecks. This will be the first argument, so checks can then be re-enabled on a case-by-case basis. Defaults to false.
disableAllWarnings Maps to -XepDisableAllWarnings (since ErrorProne 2.4.0). Defaults to false.
allErrorsAsWarnings Maps to -XepAllErrorsAsWarnings. Defaults to false.
allDisabledChecksAsWarnings Enables all Error Prone checks, checks that are disabled by default are enabled as warnings; maps to -XepDisabledChecksAsWarnings. Defaults to false.
disableWarningsInGeneratedCode Disables warnings in classes annotated with javax.annotation.processing.Generated or @javax.annotation.Generated; maps to -XepDisableWarningsInGeneratedCode. Defaults to false.
ignoreUnknownCheckNames Maps to -XepIgnoreUnknownCheckNames. Defaults to false.
ignoreSuppressionAnnotations Maps to -XepIgnoreSuppressionAnnotations (since Error Prone 2.3.3). Defaults to false.
compilingTestOnlyCode (isCompilingTestOnlyCode with Kotlin DSL) Maps to -XepCompilingTestOnlyCode. Defaults to false. (defaults to true for a source set inferred as a test source set)
excludedPaths A regular expression pattern (as a string) of file paths to exclude from Error Prone checking; maps to -XepExcludedPaths. Defaults to null.
checks A map of check name to CheckSeverity, to configure which checks are enabled or disabled, and their severity; maps each entry to -Xep:<key>:<value>, or -Xep:<key> if the value is CheckSeverity.DEFAULT. Defaults to an empty map.
checkOptions A map of check options to their value; maps each entry to -XepOpt:<key>=<value>. Use an explicit "true" value for a boolean option. Defaults to an empty map.
errorproneArgs Additional arguments passed to Error Prone. Defaults to an empty list.
errorproneArgumentProviders A list of CommandLineArgumentProvider for additional arguments passed to Error Prone. Defaults to an empty list.

Methods

Method Description
enable(checkNames...) Adds checks with their default severity. Useful in combination with disableAllChecks to selectively re-enable checks. Equivalent to check(checkName, CheckSeverity.DEFAULT) for each check name.
disable(checkNames...) Disable checks. Equivalent to check(checkName, CheckSeverity.OFF) for each check name.
warn(checkNames...) Adds checks with warning severity. Equivalent to check(checkName, CheckSeverity.WARNING) for each check name.
error(checkNames...) Adds checks with error severity. Equivalent to check(checkName, CheckSeverity.OFF) for each check name.
check(checkName to severity...) (Kotlin DSL only) Adds pairs of check name to severity. Equivalent to checks.put(first, second) for each pair.
check(checkName, severity) Adds a check with a given severity. The severity can be passed as a provider for lazy configuration. Equivalent to checks.put(checkName, severity).
option(optionName) Enables a boolean check option. Equivalent to option(checkName, true).
option(optionName, value) Adds a check option with a given value. Value can be a boolean or a string, or a provider of string. Equivalent to checkOptions.put(name, value).

A check severity can take values: DEFAULT, OFF, WARN, or ERROR.
Note that the net.ltgt.gradle.errorprone.CheckSeverity needs to be imported into your build scripts (see examples above).

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].