diff --git a/build.gradle b/build.gradle index dab5a5b2..514e8d3a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,29 +1,29 @@ plugins { - id 'java-library' + id "java-library" // To create a fat jar build/libs/...-all.jar, run: ./gradlew shadowJar - id 'com.gradleup.shadow' version '9.2.2' + id "com.gradleup.shadow" version "9.2.2" // Code formatting; defines targets "spotlessApply" and "spotlessCheck" // Requires JDK 11 or higher; the plugin crashes under JDK 8. - id 'com.diffplug.spotless' version '8.0.0' + id "com.diffplug.spotless" version "8.0.0" // Error Prone linter - id('net.ltgt.errorprone') version '4.3.0' + id("net.ltgt.errorprone") version "4.3.0" // Checker Framework pluggable type-checking - id 'org.checkerframework' version '0.6.60' + id "org.checkerframework" version "0.6.60" } repositories { mavenLocal() mavenCentral() - maven { url = 'https://central.sonatype.com/repository/maven-snapshots/' } + maven { url = "https://central.sonatype.com/repository/maven-snapshots/" } gradlePluginPortal() } ext { - errorproneVersion = '2.42.0' + errorproneVersion = "2.42.0" isJava17orHigher = JavaVersion.current() >= JavaVersion.VERSION_17 isJava21orHigher = JavaVersion.current() >= JavaVersion.VERSION_21 } @@ -43,8 +43,8 @@ java { test { useJUnitPlatform { - includeEngines 'junit-jupiter' - excludeEngines 'junit-vintage' + includeEngines "junit-jupiter" + excludeEngines "junit-vintage" } testLogging { @@ -56,9 +56,9 @@ test { } spotless { - format 'misc', { + format "misc", { // define the files to apply `misc` to - target '*.md', '.gitignore' + target "*.md", ".gitignore" // define the steps to apply to those files trimTrailingWhitespace() @@ -66,14 +66,14 @@ spotless { endWithNewline() } java { - targetExclude('**/WeakIdentityHashMap.java') + targetExclude("**/WeakIdentityHashMap.java") // googleJavaFormat() // Version number required for Java 25. - googleJavaFormat('1.28.0') + googleJavaFormat("1.28.0") formatAnnotations() } groovyGradle { - target '**/*.gradle' + target "**/*.gradle" greclipse() // which formatter Spotless should use to format .gradle files. leadingTabsToSpaces(2) trimTrailingWhitespace() @@ -89,64 +89,64 @@ dependencies { tasks.withType(JavaCompile).configureEach { // "-processing" avoids javac warning "No processor claimed any of these annotations". // "-options" avoids javac warning "source value 8 is obsolete and will be removed in a future release"; remove it when we no longer support Java 8. - options.compilerArgs << '-Xlint:all,-processing,-options' << '-Werror' + options.compilerArgs << "-Xlint:all,-processing,-options" << "-Werror" options.errorprone { - disable('ExtendsObject') // Incorrect when using the Checker Framework - disable('ReferenceEquality') // Use Interning Checker instead. - // disable('StringSplitter') // Obscure case isn't likely. - disable('AnnotateFormatMethod') // Error Prone doesn't know about Checker Framework @FormatMethod. - disable('EffectivelyPrivate') // Loses information about the abstraction. + disable("ExtendsObject") // Incorrect when using the Checker Framework + disable("ReferenceEquality") // Use Interning Checker instead. + // disable("StringSplitter") // Obscure case isn't likely. + disable("AnnotateFormatMethod") // Error Prone doesn't know about Checker Framework @FormatMethod. + disable("EffectivelyPrivate") // Loses information about the abstraction. } options.errorprone.enabled = isJava17orHigher } // Checker Framework pluggable type-checking -apply plugin: 'org.checkerframework' +apply plugin: "org.checkerframework" checkerFramework { checkers = [ // No need to run CalledMethodsChecker, because ResourceLeakChecker does so. - // 'org.checkerframework.checker.calledmethods.CalledMethodsChecker', - 'org.checkerframework.checker.formatter.FormatterChecker', - 'org.checkerframework.checker.index.IndexChecker', - 'org.checkerframework.checker.interning.InterningChecker', - 'org.checkerframework.checker.lock.LockChecker', - 'org.checkerframework.checker.nullness.NullnessChecker', - 'org.checkerframework.checker.regex.RegexChecker', - 'org.checkerframework.checker.resourceleak.ResourceLeakChecker', - 'org.checkerframework.checker.signature.SignatureChecker', - 'org.checkerframework.checker.signedness.SignednessChecker', - 'org.checkerframework.common.initializedfields.InitializedFieldsChecker', + // "org.checkerframework.checker.calledmethods.CalledMethodsChecker", + "org.checkerframework.checker.formatter.FormatterChecker", + "org.checkerframework.checker.index.IndexChecker", + "org.checkerframework.checker.interning.InterningChecker", + "org.checkerframework.checker.lock.LockChecker", + "org.checkerframework.checker.nullness.NullnessChecker", + "org.checkerframework.checker.regex.RegexChecker", + "org.checkerframework.checker.resourceleak.ResourceLeakChecker", + "org.checkerframework.checker.signature.SignatureChecker", + "org.checkerframework.checker.signedness.SignednessChecker", + "org.checkerframework.common.initializedfields.InitializedFieldsChecker", ] extraJavacArgs = [ - '-Werror', - '-AcheckPurityAnnotations', - '-ArequirePrefixInWarningSuppressions', - '-AwarnRedundantAnnotations', - '-AwarnUnneededSuppressions', + "-Werror", + "-AcheckPurityAnnotations", + "-ArequirePrefixInWarningSuppressions", + "-AwarnRedundantAnnotations", + "-AwarnUnneededSuppressions", ] } // To use a snapshot version of the Checker Framework. if (false) { // TODO: Change the above test to false when CF is released. - ext.checkerFrameworkVersion = '3.51.1' + ext.checkerFrameworkVersion = "3.51.1" dependencies { compileOnly "org.checkerframework:checker-qual:${checkerFrameworkVersion}" testCompileOnly "org.checkerframework:checker-qual:${checkerFrameworkVersion}" checkerFramework "org.checkerframework:checker:${checkerFrameworkVersion}" } configurations.all { - resolutionStrategy.cacheChangingModulesFor 0, 'minutes' + resolutionStrategy.cacheChangingModulesFor 0, "minutes" } } // To use a locally-built Checker Framework, run gradle with "-PcfLocal". -if (project.hasProperty('cfLocal')) { - def cfHome = String.valueOf(System.getenv('CHECKERFRAMEWORK')) +if (project.hasProperty("cfLocal")) { + def cfHome = String.valueOf(System.getenv("CHECKERFRAMEWORK")) dependencies { - compileOnly files(cfHome + '/checker/dist/checker-qual.jar') - testCompileOnly files(cfHome + '/checker/dist/checker-qual.jar') - checkerFramework files(cfHome + '/checker/dist/checker.jar') + compileOnly files(cfHome + "/checker/dist/checker-qual.jar") + testCompileOnly files(cfHome + "/checker/dist/checker-qual.jar") + checkerFramework files(cfHome + "/checker/dist/checker.jar") } } @@ -154,35 +154,35 @@ if (project.hasProperty('cfLocal')) { // Turn Javadoc warnings into errors. javadoc { - options.addStringOption('Xwerror', '-Xdoclint:all') - options.addStringOption('private', '-quiet') - options.addStringOption('source', '8') + options.addStringOption("Xwerror", "-Xdoclint:all") + options.addStringOption("private", "-quiet") + options.addStringOption("source", "8") doLast { - ant.replaceregexp(match:"@import url\\('resources/fonts/dejavu.css'\\);\\s*", replace:'', - flags:'g', byline:true) { + ant.replaceregexp(match:"@import url\\('resources/fonts/dejavu.css'\\);\\s*", replace:"", + flags:"g", byline:true) { fileset(dir: destinationDir) } } } check.dependsOn javadoc -tasks.register('javadocWeb', Javadoc) { - description = 'Upload API documentation to website.' +tasks.register("javadocWeb", Javadoc) { + description = "Upload API documentation to website." source = sourceSets.main.allJava destinationDir = file("/cse/web/research/plumelib/${project.name}/api") classpath = project.sourceSets.main.compileClasspath - options.addStringOption('source', '8') + options.addStringOption("source", "8") doLast { - ant.replaceregexp(match:"@import url\\('resources/fonts/dejavu.css'\\);\\s*", replace:'', - flags:'g', byline:true) { + ant.replaceregexp(match:"@import url\\('resources/fonts/dejavu.css'\\);\\s*", replace:"", + flags:"g", byline:true) { fileset(dir: destinationDir) } // Set permissions project.exec { - commandLine('chgrp', '-R', 'plse_www', "/cse/web/research/plumelib/${project.name}/api") + commandLine("chgrp", "-R", "plse_www", "/cse/web/research/plumelib/${project.name}/api") } project.exec { - commandLine('chmod', '-R', 'g+w', "/cse/web/research/plumelib/${project.name}/api") + commandLine("chmod", "-R", "g+w", "/cse/web/research/plumelib/${project.name}/api") } } } @@ -191,24 +191,24 @@ configurations { requireJavadoc } dependencies { - requireJavadoc 'org.plumelib:require-javadoc:2.0.0' + requireJavadoc "org.plumelib:require-javadoc:2.0.0" } -tasks.register('requireJavadoc', JavaExec) { - group = 'Documentation' - description = 'Ensures that Javadoc documentation exists.' +tasks.register("requireJavadoc", JavaExec) { + group = "Documentation" + description = "Ensures that Javadoc documentation exists." inputs.files jar.getArchiveFile() - mainClass = 'org.plumelib.javadoc.RequireJavadoc' + mainClass = "org.plumelib.javadoc.RequireJavadoc" classpath = configurations.requireJavadoc - args 'src/main/java' + args "src/main/java" jvmArgs += [ - '--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED', - '--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED', - '--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', - '--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED', - '--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED', - '--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED', - '--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', - '--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED', + "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", + "--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", ] } check.dependsOn requireJavadoc @@ -217,7 +217,7 @@ javadocWeb.dependsOn requireJavadoc // Emacs support /* Make Emacs TAGS table */ -tasks.register('tags', Exec) { - description = 'Run etags to create an Emacs TAGS table' - commandLine 'bash', '-c', "find src/ -name '*.java' | sort | xargs etags" +tasks.register("tags", Exec) { + description = "Run etags to create an Emacs TAGS table" + commandLine "bash", "-c", "find src/ -name '*.java' | sort | xargs etags" } diff --git a/gradle/mavencentral.gradle b/gradle/mavencentral.gradle index a0330c01..f248e3fb 100644 --- a/gradle/mavencentral.gradle +++ b/gradle/mavencentral.gradle @@ -17,16 +17,16 @@ // * Make a GitHub release. Go to the GitHub releases page, make a release, call it "reflection-util 1.1.5", use the text from ../CHANGELOG.md as the description, attach the .jar and -all.jar files from ../build/libs/ . // * Finally, run on the CSE filesystem: git pull && ./gradlew javadocWeb -apply plugin: 'maven-publish' -apply plugin: 'signing' +apply plugin: "maven-publish" +apply plugin: "signing" -group = 'org.plumelib' -version = '1.1.5' +group = "org.plumelib" +version = "1.1.5" ext { - packageName = 'reflection-util' + packageName = "reflection-util" } -final isSnapshot = version.contains('SNAPSHOT') +final isSnapshot = version.contains("SNAPSHOT") java { withJavadocJar() @@ -43,8 +43,8 @@ publishing { from components.java pom { - name = 'Reflection Util' - description = 'Utility libraries for reflection, converting among string representations of Java types, etc.' + name = "Reflection Util" + description = "Utility libraries for reflection, converting among string representations of Java types, etc." url = "https://github.com/plume-lib/${packageName}" scm { @@ -55,16 +55,16 @@ publishing { licenses { license { - name = 'MIT License' - url = 'https://opensource.org/licenses/MIT' + name = "MIT License" + url = "https://opensource.org/licenses/MIT" } } developers { developer { - id = 'mernst' - name = 'Michael Ernst' - email = 'mernst@alum.mit.edu' + id = "mernst" + name = "Michael Ernst" + email = "mernst@alum.mit.edu" } } } @@ -74,12 +74,12 @@ publishing { repositories { maven { url = (isSnapshot - ? project.properties.getOrDefault('SNAPSHOT_REPOSITORY_URL', 'https://central.sonatype.com/repository/maven-snapshots/') - : project.properties.getOrDefault('RELEASE_REPOSITORY_URL', 'https://ossrh-staging-api.central.sonatype.com/service/local/') + ? project.properties.getOrDefault("SNAPSHOT_REPOSITORY_URL", "https://central.sonatype.com/repository/maven-snapshots/") + : project.properties.getOrDefault("RELEASE_REPOSITORY_URL", "https://ossrh-staging-api.central.sonatype.com/service/local/") ) credentials { - username = project.properties.get('SONATYPE_NEXUS_USERNAME') - password = project.properties.get('SONATYPE_NEXUS_PASSWORD') + username = project.properties.get("SONATYPE_NEXUS_USERNAME") + password = project.properties.get("SONATYPE_NEXUS_PASSWORD") } } }