diff --git a/build.gradle b/build.gradle index 1661ac218ce..03637bd980b 100644 --- a/build.gradle +++ b/build.gradle @@ -43,6 +43,7 @@ ext { "apache-rat": "0.11", "javacc": "5.0", "jflex": "1.7.0", + "ecj": "3.19.0" ] } @@ -54,6 +55,10 @@ ext { apply from: file('gradle/generate-defaults.gradle') +// Ant-compatibility layer: apply folder layout early so that +// evaluation of other scripts doesn't need to be deferred. +apply from: file('gradle/ant-compat/folder-layout.gradle') + // Set up defaults and configure aspects for certain modules or functionality // (java, tests) apply from: file('gradle/defaults.gradle') @@ -80,6 +85,7 @@ apply from: file('gradle/validation/validate-source-patterns.gradle') apply from: file('gradle/validation/config-file-sanity.gradle') apply from: file('gradle/validation/rat-sources.gradle') apply from: file('gradle/validation/owasp-dependency-check.gradle') +apply from: file('gradle/validation/ecj-lint.gradle') // Source or data regeneration tasks apply from: file('gradle/generation/jflex.gradle') @@ -99,7 +105,6 @@ apply from: file('gradle/help.gradle') // here so that we can coexist with current ant build but they are indicative // of potential problems with the build conventions, dependencies, etc. apply from: file('gradle/ant-compat/force-versions.gradle') -apply from: file('gradle/ant-compat/folder-layout.gradle') apply from: file('gradle/ant-compat/misc.gradle') apply from: file('gradle/ant-compat/resolve.gradle') apply from: file('gradle/ant-compat/post-jar.gradle') diff --git a/gradle/validation/ecj-lint.gradle b/gradle/validation/ecj-lint.gradle new file mode 100644 index 00000000000..5ae13c1c671 --- /dev/null +++ b/gradle/validation/ecj-lint.gradle @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// This adds 'ecjLint' task. + +configure(rootProject) { + configurations { + ecjDeps + } + + dependencies { + ecjDeps "org.eclipse.jdt:ecj:${scriptDepVersions['ecj']}" + } +} + +allprojects { + plugins.withType(JavaPlugin) { + // Create a [sourceSetName]EcjLint task for each source set + // with a non-empty java.srcDirs. These tasks are then + // attached to project's "ecjLint" task. + def lintTasks = sourceSets.collect { sourceSet -> + def srcDirs = sourceSet.java.srcDirs.findAll { dir -> dir.exists() } + + tasks.create(sourceSet.getTaskName("ecjLint", null), JavaExec, { + // This dependency is on a configuration; technically it causes + // all dependencies to be resolved before this task executes + // (this includes scheduling tasks that compile the + // sources from other projects for example). + dependsOn sourceSet.compileClasspath + + // The inputs are all source files from the sourceSet. + inputs.files sourceSet.allSource.asFileTree + // The outputs are always up to date (we don't generate anything). + outputs.upToDateWhen { true } + + // We create a task for all source sets but ignore those + // that don't have any Java source directories. + enabled = !srcDirs.isEmpty() + + classpath = rootProject.configurations.ecjDeps + main = "org.eclipse.jdt.internal.compiler.batch.Main" + + // Don't emit any .class files. + // Hack around "-d none" still emitting package-info.class + // by running in a temporary directory. + def tmpDst = getTemporaryDir() + workingDir tmpDst + + args += [ "-d", "none" ] + + // Compilation environment. + args += [ "-source", project.java.sourceCompatibility ] + args += [ "-target", project.java.targetCompatibility ] + args += [ "-encoding", "UTF-8"] + args += [ "-proc:none" ] + args += [ "-nowarn" ] + args += [ "-enableJavadoc" ] + args += [ "-properties", project(":lucene").file("tools/javadoc/ecj.javadocs.prefs").absolutePath ] + + doFirst { + tmpDst.mkdirs() + + // Add classpath locations at execution time (can't resolve the + // configuration at evaluation time). Filter out non-existing entries + // (output folders for non-existing input source dirs like resources). + def cpath = sourceSet.compileClasspath.filter { p -> p.exists() } + if (!cpath.isEmpty()) { + args += ["-classpath", cpath.asPath] + } + + // Add source location(s). Ideally we'd provide a set of files as in: + // args += sourceSet.java.files + // but this exceeds max allowed command line size. So we pass source + // directories instead: + args += srcDirs + } + }) + } + + task ecjLint() { + description "Lint Java sources using ECJ." + group "Verification" + + dependsOn lintTasks + } + + // Attach ecjLint to check. + check.dependsOn ecjLint + } +} + +// This excludes solr-ref-guide from the check (excludes are not taken into account +// and linting of the ant-based task fails. +configure(project(":solr:solr-ref-guide")) { + afterEvaluate { + project.tasks.findByPath("ecjLintMain").enabled = false + } +} diff --git a/gradle/validation/precommit.gradle b/gradle/validation/precommit.gradle index 7ba530e62f2..f98952dcf1d 100644 --- a/gradle/validation/precommit.gradle +++ b/gradle/validation/precommit.gradle @@ -39,6 +39,7 @@ configure(rootProject) { "licenses", "javadoc", "rat", + "ecjLint" ]} } } diff --git a/solr/solr-ref-guide/build.gradle b/solr/solr-ref-guide/build.gradle index 5a40e27ed51..7e6889414a5 100644 --- a/solr/solr-ref-guide/build.gradle +++ b/solr/solr-ref-guide/build.gradle @@ -96,6 +96,9 @@ dependencies { sourceSets { refGuide { java { + srcDirs = [] + } + resources { srcDirs = ['src'] } } @@ -107,6 +110,12 @@ sourceSets { exclude "**/asciidoctor-antlib.xml" } } + + test { + java { + srcDirs = [] + } + } } ext {