You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2019/08/18 01:17:28 UTC

[lucene-solr] 02/03: SOLR-13452: Lots of fixes and minor improvements.

This is an automated email from the ASF dual-hosted git repository.

markrmiller pushed a commit to branch jira/SOLR-13452_gradle_5
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit c5377b6e1822fffe68dc11e8488ab8f26047fe6a
Author: markrmiller <mi...@apple.com>
AuthorDate: Sat Aug 17 21:14:22 2019 -0400

    SOLR-13452: Lots of fixes and minor improvements.
---
 build.gradle                                       |  87 +++++++----
 buildSrc/build.gradle                              |   4 +-
 .../common/help-text/buildDependenciesHelp.txt     |  13 +-
 buildSrc/ide/eclipse.gradle                        |   6 +-
 buildSrc/src/buildTest/java/BaseTestClass.java     |  33 ++--
 buildSrc/src/buildTest/java/TestEnforcers.java     |   4 +-
 .../lucene/gradle/CheckSourcePatterns.groovy       |   6 +-
 .../org/apache/lucene/gradle/RatSources.groovy     |  10 +-
 buildSrc/test-build-wdocker/test-build.sh          |  21 +--
 buildSrc/test-build-wdocker/test-check-sources.sh  |  15 +-
 buildSrc/test-build-wdocker/test-rat-sources.sh    |  22 ++-
 gradle.properties                                  |   2 +-
 versions.lock                                      | 169 +++++++++++++++------
 13 files changed, 246 insertions(+), 146 deletions(-)

diff --git a/build.gradle b/build.gradle
index f00bfab..acee1d5 100644
--- a/build.gradle
+++ b/build.gradle
@@ -22,7 +22,7 @@ import org.apache.commons.io.FilenameUtils
 import com.google.common.base.Strings
 
 plugins {
-  id "com.palantir.consistent-versions" version "1.8.0"
+  id "com.palantir.consistent-versions" version "1.11.0"
 }
 
 // TOC
@@ -41,8 +41,11 @@ plugins {
 buildDir = file("build")
 
 // define lucene-solr project lists that exclude buildSrc
-def luceneSolrProjects = allprojects.findAll { project -> project.name != 'buildSrc'};
-def luceneSolrSubProjects = subprojects.findAll { project -> project.name != 'buildSrc'}
+
+def excludeProjects = ['buildSrc', 'lucene', 'solr', 'lucene-analysis']
+
+def luceneSolrProjects = allprojects - excludeProjects;
+def luceneSolrSubProjects = subprojects - excludeProjects;
 
 def rootProjectDir = project.rootProject.projectDir;
 
@@ -53,52 +56,72 @@ apply from: file("${rootProjectDir}/buildSrc/common/configure-ext.gradle")
 apply from: mfile(rootProjectDir, 'buildSrc/common/build-help.gradle')
 
 
-// *** lucene-solr all module config - configure all lucene-solr projects, including root project
+// *** lucene-solr all module config - configure all lucene-solr projects, including root project, excluding aggregate modules
 configure(luceneSolrProjects) {
   buildDir = file("build")
   
   // setup repositories
   apply from: mfile(rootProjectDir, 'buildSrc/common/configure-repositories.gradle')
+
   
-  apply plugin: 'idea'
-  apply plugin: 'eclipse'
-  
-  task ratSources(type: org.apache.lucene.gradle.RatSources) {
-    group = 'Verification'
-    description = "Checks source files for proper license headers."
-    excludes = ['**/TODO', '**/*.txt,', '**/*.iml']
-    check.dependsOn ratSources
+  // we can't safely directly access another projects configuration, so we do this
+  configurations {
+    rat
   }
   
-  task checkSourcePatterns(type: org.apache.lucene.gradle.CheckSourcePatterns) {
-    group = 'Verification'
-    description = "Checks source files for project violations."
-    baseDir = projectDir
-    check.dependsOn checkSourcePatterns
+  dependencies {
+    rat project(':buildSrc')
   }
   
-  task checkMissingJavaDocs {
-    group = 'Verification'
-    description = "Checks for missing JavaDocs."
-    
-    doLast {
-      project.exec {
-        workingDir project.projectDir.getAbsolutePath()
-        executable "${python_exe}"
-        args = ['-B', rootProjectDir.getAbsolutePath() + '/dev-tools/scripts/checkJavaDocs.py', project.projectDir.getAbsolutePath(), 'class']
-      }
-    }
+  task ratSources(type: org.apache.lucene.gradle.RatSources) {
+      group = 'Verification'
+      description = "Checks source files for proper license headers."
+      excludes = [
+        '**/TODO',
+        '**/*.txt,',
+        '**/*.iml'
+      ]
+      check.dependsOn ratSources
   }
-  
-  // TODO: check.dependsOn checkMissingJavaDocs
-
 }
 
 // *** lucene-solr sub module config - configure all lucene-solr modules (excludes the root project)
 configure(luceneSolrSubProjects) {
+
+// TODO: prob wont go here    
+//  task checkMissingJavaDocs {
+//    group = 'Verification'
+//    description = "Checks for missing JavaDocs."
+//    
+//    doLast {
+//      project.exec {
+//        workingDir project.projectDir.getAbsolutePath()
+//        executable "${python_exe}"
+//        args = [
+//          '-B',
+//          rootProjectDir.getAbsolutePath() + '/dev-tools/scripts/checkJavaDocs.py',
+//          project.projectDir.getAbsolutePath(),
+//          'class'
+//        ]
+//      }
+//    }
+//  }
   
+  // TODO: check.dependsOn checkMissingJavaDocs
+  
+  configurations {
+    sourceJarOutput
+  }
+    
   plugins.withType(JavaPlugin) {
 
+    task checkSourcePatterns(type: org.apache.lucene.gradle.CheckSourcePatterns) {
+      group = 'Verification'
+      description = "Checks source files for project violations."
+      baseDir = projectDir
+      check.dependsOn checkSourcePatterns
+    }
+      
     project.plugins.apply(LuceneSolrForbiddenApisPlugin)
     
     sourceCompatibility = "11"
@@ -176,7 +199,7 @@ configure(rootProject) {
   
   task pristineClean(type: org.apache.lucene.gradle.PristineClean) {}
   
-  ext.testsResults = [] // We'll hold the summaries here
+  ext.testsResults = [] // test result summaries
   
   gradle.buildFinished {
       def allResults = ext.testsResults
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 48dae1a..f664cdb 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -80,6 +80,9 @@ configurations {
   buildTestRuntimeOnly.extendsFrom testRuntimeOnly
 }
 
+project.ext.properties.tests_jvms = 1
+project.ext.properties.tests_failfast = true
+
 task buildTest(type: Test) {
   group = LifecycleBasePlugin.VERIFICATION_GROUP
   description = 'Runs the build tests (if using a unix env and docker is available). Ideally, run pristineClean first.'
@@ -90,7 +93,6 @@ task buildTest(type: Test) {
   classpath = sourceSets.buildTest.runtimeClasspath
 
   outputs.upToDateWhen { false }
-  mustRunAfter tasks.test
   dependsOn project.rootProject.clean
 }
 
diff --git a/buildSrc/common/help-text/buildDependenciesHelp.txt b/buildSrc/common/help-text/buildDependenciesHelp.txt
index 0121b8d..1d2cd94 100644
--- a/buildSrc/common/help-text/buildDependenciesHelp.txt
+++ b/buildSrc/common/help-text/buildDependenciesHelp.txt
@@ -3,16 +3,16 @@
 - Dependency Managment -
 ------------------------
 
-Except in buildSrc, dependencies are defined in build.gradle (the dependencies block should be one of the first) with no version. Versions are specified in the root project versions.props.
+Except in buildSrc (where versions are specified directly), dependencies are defined in build.gradle (the dependencies block should be one of the first) with no version. Versions are specified in the root project versions.props.
 
   i.e.
   com.epam:parso=2.0.9
   com.fasterxml.jackson*:*=2.9.8
 
-This version will be the minimum version used. Gradle will choose the highest version neccessary to satisify all of our dependencies and our minimum version. Where that behavior is not ideal it can be overridden. However, we prefer not forcing version constraints unless neccessary. In a complex web of interconnected software projects with security vulnerabilites and performance bugs and overlapping dependencies, we want to favor updating our dependencies at the rate our dependencies upda [...]
+This version will be the minimum version used. Gradle will choose the highest version neccessary to satisify all of our dependencies and our minimum version. Where that behavior is not ideal, it can be overridden. However, we prefer not forcing version constraints unless neccessary. In a complex web of interconnected software projects with security vulnerabilites and performance bugs and overlapping dependencies, we want to favor updating our dependencies at the rate our dependencies upd [...]
 
 Support for this is implemented via the plugin https://github.com/palantir/gradle-consistent-versions
-This plugin provides support for placing versions in versions.props, ensures all versions for dependencies across all modules are consistent and also enforces version locking via a single root project lock file that lists all dependencies and their versions (versions.lock)
+This plugin provides support for placing versions in versions.props, ensures all versions for dependencies across all modules are consistent and also enforces version locking via a single root project lock file that lists all dependencies and their versions (versions.lock), each dependency on a single line.
 
 If you modify dependencies - add them, remove them, or change versions - you will need to run gradlew --write-locks and commit an updated versions.lock file that will show a clear summary of the total dependency change set.
 
@@ -37,7 +37,6 @@ You can use this to get a list of objects in a module that are referenced but ca
 You can use this to track down where a dependency comes from. Run it at the level of the module you are searching, i.e. gradlew -q solr:solr-core:dependencyInsight
 
   i.e.
-  gradlew -q dependencyInsight --dependency stax
   gradlew -q dependencyInsight --configuration testRuntimeClasspath --dependency zookeeper
 
 By default it will search the UnifiedClasspath, but you can specify which configuration to look at, i.e. runtime, testRuntime, runtimeClasspath, etc
@@ -46,4 +45,10 @@ By default it will search the UnifiedClasspath, but you can specify which config
 
 This will show all the dependencies in a tree view.
 
+  why - you pass this a hash from versions.props and it will tell you which dependencies are responsible for bringing the dependency for the hash.
+  
+  i.e.
+  gradlew why --hash e3159ee6 
+  
+
   
\ No newline at end of file
diff --git a/buildSrc/ide/eclipse.gradle b/buildSrc/ide/eclipse.gradle
index 4308d1f..174902e 100644
--- a/buildSrc/ide/eclipse.gradle
+++ b/buildSrc/ide/eclipse.gradle
@@ -86,11 +86,11 @@ suspend=true
 vf.version=3
 """
 
-      def uiPrefFile = project.mfile(project.rootProject.project(":buildSrc").projectDir, "ide/resources/org.eclipse.jdt.ui.prefs")
-      def resourcePrefFile = project.mfile(project.rootProject.project(":buildSrc").projectDir, "ide/resources/org.eclipse.core.resources.prefs")
+      def uiPrefFile = mfile(project(":buildSrc").projectDir, "ide/resources/org.eclipse.jdt.ui.prefs")
+      def resourcePrefFile = mfile(project(":buildSrc").projectDir, "ide/resources/org.eclipse.core.resources.prefs")
       def corePrefFile = mfile(project(":buildSrc").projectDir, "ide/resources/org.eclipse.jdt.core.prefs")
       copy {
-         from uiPrefFile, resourcePrefFile, corePrefFile
+         from [uiPrefFile, resourcePrefFile, corePrefFile]
          into file('.settings')
        }
 
diff --git a/buildSrc/src/buildTest/java/BaseTestClass.java b/buildSrc/src/buildTest/java/BaseTestClass.java
index 2cdd74b..9c9f53a 100644
--- a/buildSrc/src/buildTest/java/BaseTestClass.java
+++ b/buildSrc/src/buildTest/java/BaseTestClass.java
@@ -17,9 +17,9 @@
 import static org.junit.Assume.assumeTrue;
 
 import java.io.BufferedReader;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -30,7 +30,6 @@ import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Test;
 
 public abstract class BaseTestClass extends Assert {
   
@@ -88,14 +87,9 @@ public abstract class BaseTestClass extends Assert {
       throws Exception {
     return runCmd(cmd, Collections.emptyMap(), cmdIsNoop, trace);
   }
-  
+
   public static PbResult runCmd(String[] cmd, Map<String,String> env,
       boolean cmdIsNoop, boolean trace) throws Exception {
-    return runCmd(cmd, env, null, cmdIsNoop, trace);
-  }
-  
-  public static PbResult runCmd(String[] cmd, Map<String,String> env, File cwd,
-      boolean cmdIsNoop, boolean trace) throws Exception {
     if (trace) System.out.println("execute cmd: " + Arrays.asList(cmd));
     if (cmdIsNoop) return new PbResult();
     ProcessBuilder pb = new ProcessBuilder(cmd);
@@ -117,27 +111,18 @@ public abstract class BaseTestClass extends Assert {
   
   public static PbResult runCmd(String[] cmd, Map<String,String> env,
       boolean cmdIsNoop, boolean trace, boolean returnOutput) throws Exception {
-    return runCmd(cmd, env, null, cmdIsNoop, trace, returnOutput);
-  }
-  
-  public static PbResult runCmd(String[] cmd, Map<String,String> env, File cwd,
-      boolean cmdIsNoop, boolean trace, boolean returnOutput) throws Exception {
     if (trace) System.out.println("execute cmd: " + Arrays.asList(cmd));
     if (cmdIsNoop) return new PbResult();
     ProcessBuilder pb = new ProcessBuilder(cmd);
-    return processPb(env, pb, cwd, returnOutput);
+    return processPb(env, pb, returnOutput);
   }
   
   private static PbResult processPb(Map<String,String> env, ProcessBuilder pb, boolean returnOutput)
       throws Exception {
-    return processPb(env, pb, null, returnOutput);
-  }
-  
-  private static PbResult processPb(Map<String,String> env, ProcessBuilder pb, File cwd, boolean returnOutput)
-      throws Exception {
     try {
       pb.environment().putAll(env);
-      pb.environment().put("PATH", System.getenv().get("PATH") + File.pathSeparator + "/usr/local/bin" + File.pathSeparator + "/usr/bin");
+      //pb.environment().put("user.dir", "/home/lucene");
+      pb.environment().put("PATH", System.getenv().get("PATH") + System.getProperty("path.separator") + "/usr/local/bin" + System.getProperty("path.separator") + "/usr/bin");
       System.out.println(System.getenv());
      // pb.environment().put("UID", System.getenv().get("UID"));
     } catch (Exception e) {
@@ -145,9 +130,9 @@ public abstract class BaseTestClass extends Assert {
       throw e;
     }
     pb.redirectErrorStream(true);
-    if (cwd == null) {
-      pb.directory(cwd);
-    }
+    
+    pb.directory(null);
+
     pb.inheritIO();
     Process p = null;
     try {
@@ -156,7 +141,7 @@ public abstract class BaseTestClass extends Assert {
       throw new RuntimeException(e);
     }
 
-    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
+    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "UTF-8"));
     StringBuilder sb = new StringBuilder();
     String line = null;
     while ((line = br.readLine()) != null) {
diff --git a/buildSrc/src/buildTest/java/TestEnforcers.java b/buildSrc/src/buildTest/java/TestEnforcers.java
index 027314d..dcbd5ed 100644
--- a/buildSrc/src/buildTest/java/TestEnforcers.java
+++ b/buildSrc/src/buildTest/java/TestEnforcers.java
@@ -51,7 +51,7 @@ public class TestEnforcers extends BaseTestClass {
     System.out.println("Start test-rat-sources.sh test in Docker container (" + env + ") ...");
     String[] cmd = new String[]{"bash", "test-build-wdocker/test-rat-sources.sh"};
     PbResult result = runCmd(cmd, env, false, false, false);
-    assertEquals("Testing test-build.sh failed", 0, result.returnCode);
+    assertEquals("Testing test-rat-sources.sh failed", 0, result.returnCode);
   }
 
   @Test
@@ -59,6 +59,6 @@ public class TestEnforcers extends BaseTestClass {
     System.out.println("Start test-check-sources.sh test in Docker container (" + env + ") ...");
     String[] cmd = new String[]{"bash", "test-build-wdocker/test-check-sources.sh"};
     PbResult result = runCmd(cmd, env, false, false, false);
-    assertEquals("Testing test-build.sh failed", 0, result.returnCode);
+    assertEquals("Testing test-check-sources.sh failed", 0, result.returnCode);
   }
 }
diff --git a/buildSrc/src/main/groovy/org/apache/lucene/gradle/CheckSourcePatterns.groovy b/buildSrc/src/main/groovy/org/apache/lucene/gradle/CheckSourcePatterns.groovy
index 86bdc48..ec5a182 100644
--- a/buildSrc/src/main/groovy/org/apache/lucene/gradle/CheckSourcePatterns.groovy
+++ b/buildSrc/src/main/groovy/org/apache/lucene/gradle/CheckSourcePatterns.groovy
@@ -41,13 +41,14 @@ class CheckSourcePatterns extends DefaultTask {
   
   @TaskAction
   void check() {
+    ant.lifecycleLogLevel = "INFO"
     ant.fileScanner{
       fileset(dir: baseDir) {
         exts.each{
           //include(name: 'lucene/**/*.' + it)
           //include(name: 'solr/**/*.' + it)
           //include(name: 'dev-tools/**/*.' + it)
-          include(name: '*.' + it)
+          include(name: '**/*.' + it)
         }
         // TODO: For now we don't scan txt files, so we
         // check licenses in top-level folders separately:
@@ -55,6 +56,7 @@ class CheckSourcePatterns extends DefaultTask {
         include(name: '*/*.txt')
         // excludes:
         exclude(name: '**/build/**')
+        exclude(name: '**/bin/**')
         exclude(name: '**/dist/**')
         exclude(name: '**/.out/**')
         exclude(name: '**/.settings/**')
@@ -161,7 +163,7 @@ class CheckSourcePatterns extends DefaultTask {
   protected def found = 0
   protected def violations = new TreeSet()
   protected def reportViolation = { f, name ->
-  log.error(name + ': ' + f.toString().substring(baseDir.length() + 1).replace(File.separatorChar, (char)'/'))
+    log.error(name + ': ' + f.toString().substring(baseDir.length() + 1).replace(File.separatorChar, (char)'/'))
     violations.add(name)
     found++
   }
diff --git a/buildSrc/src/main/groovy/org/apache/lucene/gradle/RatSources.groovy b/buildSrc/src/main/groovy/org/apache/lucene/gradle/RatSources.groovy
index 33c977b..3247086 100644
--- a/buildSrc/src/main/groovy/org/apache/lucene/gradle/RatSources.groovy
+++ b/buildSrc/src/main/groovy/org/apache/lucene/gradle/RatSources.groovy
@@ -41,9 +41,9 @@ class RatSources extends DefaultTask {
   
   @TaskAction
   void rat() {
-    ant.lifecycleLogLevel = "ERROR"
+    ant.lifecycleLogLevel = "ERROR" // so we don't output ugly ant warnings about redefining a task
     
-    File logFile = File.createTempFile("temp",".tmp")
+    File logFile = File.createTempFile("rat-",".log")
     logFile.deleteOnExit()
     
     def excludeString = ""
@@ -54,10 +54,10 @@ class RatSources extends DefaultTask {
       excludeString += it
     }
     
-    ant.taskdef(resource: 'org/apache/rat/anttasks/antlib.xml', classpath: project.rootProject.project(":buildSrc").configurations.rat.asPath)
+    ant.taskdef(resource: 'org/apache/rat/anttasks/antlib.xml', classpath: project.configurations.rat.asPath)
     
     ant.report(reportFile: logFile.getAbsolutePath(), addDefaultLicenseMatchers: 'true') {
-      ant.fileset(dir: ".", includes: "*.xml", excludes: excludeString)
+      ant.fileset(dir: project.projectDir.getAbsolutePath(), includes: "*.xml", excludes: excludeString)
       
       if (project.sourceSets.hasProperty('main') && project.sourceSets.main.hasProperty('java')) {
         project.sourceSets.main.java.srcDirs.each { dir ->        
@@ -71,6 +71,8 @@ class RatSources extends DefaultTask {
         }
       }
       
+      // TODO: resources
+      
       // BSD-like stuff
       ant.substringMatcher(licenseFamilyCategory: "BSD  ", licenseFamilyName: "Modified BSD License") {
         //  brics automaton
diff --git a/buildSrc/test-build-wdocker/test-build.sh b/buildSrc/test-build-wdocker/test-build.sh
index 641660e..39a3e63 100644
--- a/buildSrc/test-build-wdocker/test-build.sh
+++ b/buildSrc/test-build-wdocker/test-build.sh
@@ -45,38 +45,41 @@ exec() {
 
 set -x
 
-# NOTE: we don't clean right now, as it would wipe out buildSrc/build on us for the host
+exec_args=""
+gradle_args="--console=plain -x verifyLocks"
+
+# NOTE: we don't clean right now, as it would wipe out buildSrc/build on us for the host, but buildTest dependsOn clean
 
 # build without unit tests
-cmd="cd /home/lucene/project;./gradlew build -x test"
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} build -x test"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # test regenerate task
-cmd="cd /home/lucene/project;./gradlew regenerate"
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} regenerate"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # test forbiddenApis task
-cmd="cd /home/lucene/project;./gradlew forbiddenApis"
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} forbiddenApis"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # test eclipse tasks
-cmd="cd /home/lucene/project;./gradlew cleanEclipse eclipse"
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} cleanEclipse eclipse"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # test unusedDependencies task
-cmd="cd /home/lucene/project;./gradlew solr:solr-core:unusedDependencies"
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} solr:solr-core:unusedDependencies"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # try deeper structure
-cmd="cd /home/lucene/project;./gradlew solr:contrib:solr-contrib-clustering:unusedDependencies"
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} solr:contrib:solr-contrib-clustering:unusedDependencies"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # test missingDependencies task
-cmd="cd /home/lucene/project;./gradlew solr:solr-core:missingDependencies"
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} solr:solr-core:missingDependencies"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # we should still be able to build now
-cmd="cd /home/lucene/project;./gradlew build -x test"
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} build -x test -x verifyLocks"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 
diff --git a/buildSrc/test-build-wdocker/test-check-sources.sh b/buildSrc/test-build-wdocker/test-check-sources.sh
index 6fe2aaf..8363f93 100644
--- a/buildSrc/test-build-wdocker/test-check-sources.sh
+++ b/buildSrc/test-build-wdocker/test-check-sources.sh
@@ -45,20 +45,23 @@ exec() {
 
 set -x
 
-# NOTE: we don't clean right now, as it would wipe out buildSrc/build on us for the host
+exec_args=""
+gradle_args="--console=plain -x verifyLocks"
+
+# NOTE: we don't clean right now, as it would wipe out buildSrc/build on us for the host, but buildTest dependsOn clean
 
 # first check that checkSourcePatterns passes
-cmd="cd /home/lucene/project;./gradlew checkSourcePatterns"
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} checkSourcePatterns"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # create an xml file with no license in lucene
-cmd="ls /home/lucene/project;echo \\"\t\\" >> /home/lucene/project/solr/contrib/clustering/src/java/org/tab_file.xml"
+cmd="ls /home/lucene/project;echo -e '\t' >> /home/lucene/project/solr/contrib/clustering/src/java/org/tab_file.xml"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # test that checkSourcePatterns fails on our test file
-cmd="cd /home/lucene/project;./gradlew checkSourcePatterns"
-if [ exec "${cmd}" "${exec_args}" ]; then
-  echocheckSourcePatterns should fail!
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} checkSourcePatterns"
+if exec "${cmd}" "${exec_args}"; then
+  echo "checkSourcePatterns should fail!"
   exit 1
 fi
 
diff --git a/buildSrc/test-build-wdocker/test-rat-sources.sh b/buildSrc/test-build-wdocker/test-rat-sources.sh
index 2b9e8c4..c367c9e 100644
--- a/buildSrc/test-build-wdocker/test-rat-sources.sh
+++ b/buildSrc/test-build-wdocker/test-rat-sources.sh
@@ -45,31 +45,27 @@ exec() {
 
 set -x
 
-# NOTE: we don't clean right now, as it would wipe out buildSrc/build on us for the host
+exec_args=""
+gradle_args="--console=plain -x verifyLocks"
+
+# NOTE: we don't clean right now, as it would wipe out buildSrc/build on us for the host, but buildTest dependsOn clean
 
 # first check that rat passes
-cmd="cd /home/lucene/project;./gradlew ratSources"
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} ratSources"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # create an xml file with no license in lucene
-cmd="ls /home/lucene/project;touch /home/lucene/project/lucene/core/src/java/org/no_license_test_file.xml"
+cmd="touch /home/lucene/project/lucene/core/src/java/org/no_license_test_file.xml"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
 # test that rat fails on our test file
-cmd="cd /home/lucene/project;./gradlew ratSources"
-if [ exec "${cmd}" "${exec_args}" ]; then
+cmd="cd /home/lucene/project;./gradlew ${gradle_args} ratSources"
+if exec "${cmd}" "${exec_args}"; then
+  echo "rat should fail!"
   exit 1 # rat should fail!
-else
-  exit 0	
 fi
 
 # clean test file
 cmd="rm /home/lucene/project/lucene/core/src/java/org/no_license_test_file.xml"
 exec "${cmd}" "${exec_args}" || { exit 1; }
 
-# create a java file with no license in solr tests
-cmd="ls /home/lucene/project;touch /home/lucene/project/solr/core/src/test/org/no_license_test_file.java"
-if [ exec "${cmd}" "${exec_args}" ]; then
-  echo rat should fail!
-  exit 1 
-fi
diff --git a/gradle.properties b/gradle.properties
index 5f36b4c..953f55b 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -18,7 +18,7 @@ org.gradle.parallel=true
 
 org.gradle.caching=false
 
-# experimental gradle feature - does not currently work with our version constraints plugin
+# experimental gradle feature - does not currently work with our version constraints plugin: https://github.com/palantir/gradle-consistent-versions/pull/145
 org.gradle.configureondemand=false
 
 org.gradle.jvmargs=-Xmx1g
diff --git a/versions.lock b/versions.lock
index bf9c9fb..57de072 100644
--- a/versions.lock
+++ b/versions.lock
@@ -9,22 +9,23 @@ com.carrotsearch.randomizedtesting:randomizedtesting-runner:2.7.2 (1 constraints
 com.cybozu.labs:langdetect:1.1-20120112 (1 constraints: 5c066d5e)
 com.drewnoakes:metadata-extractor:2.11.0 (2 constraints: c011970f)
 com.epam:parso:2.0.9 (2 constraints: 6e11a9f2)
-com.fasterxml.jackson.core:jackson-annotations:2.9.8 (4 constraints: ad2e114a)
-com.fasterxml.jackson.core:jackson-core:2.9.8 (6 constraints: 6c5e8440)
-com.fasterxml.jackson.core:jackson-databind:2.9.8 (4 constraints: 0027869d)
+com.fasterxml.jackson.core:jackson-annotations:2.9.8 (8 constraints: d07504d7)
+com.fasterxml.jackson.core:jackson-core:2.9.8 (12 constraints: 90cb8608)
+com.fasterxml.jackson.core:jackson-databind:2.9.8 (14 constraints: 6fd9c0df)
 com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.9.8 (1 constraints: 15051836)
 com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.8 (1 constraints: 15051836)
-com.fasterxml.woodstox:woodstox-core:5.2.0 (1 constraints: 360a63bc)
+com.fasterxml.woodstox:woodstox-core:5.2.0 (2 constraints: c1171084)
 com.github.ben-manes.caffeine:caffeine:2.4.0 (1 constraints: 08050136)
 com.github.cliftonlabs:json-simple:3.0.2 (1 constraints: 82145f7d)
 com.github.jai-imageio:jai-imageio-core:1.4.0 (1 constraints: 5c0ced01)
 com.github.junrar:junrar:2.0.0 (1 constraints: 590ce601)
 com.github.openjson:openjson:1.0.10 (1 constraints: 890c6b0e)
+com.github.stephenc.jcip:jcip-annotations:1.0-1 (1 constraints: 930cbb09)
 com.github.virtuald:curvesapi:1.04 (2 constraints: 730fc68c)
-com.google.code.gson:gson:2.8.5 (1 constraints: 660c0302)
-com.google.guava:guava:25.1-jre (2 constraints: 400c4e0d)
-com.google.protobuf:protobuf-java:3.7.1 (3 constraints: c311263b)
-com.google.re2j:re2j:1.2 (1 constraints: a7041c2c)
+com.google.code.gson:gson:2.8.5 (2 constraints: f1197726)
+com.google.guava:guava:25.1-jre (18 constraints: 291e586c)
+com.google.protobuf:protobuf-java:3.7.1 (17 constraints: 7e168483)
+com.google.re2j:re2j:1.2 (2 constraints: ce1117f1)
 com.googlecode.javaewah:JavaEWAH:1.1.6 (1 constraints: 480e7e50)
 com.googlecode.json-simple:json-simple:1.1.1 (1 constraints: 5a0ce501)
 com.googlecode.juniversalchardet:juniversalchardet:1.0.3 (2 constraints: 601190f1)
@@ -33,38 +34,49 @@ com.healthmarketscience.jackcess:jackcess:2.1.12 (2 constraints: c411e10f)
 com.healthmarketscience.jackcess:jackcess-encrypt:2.1.4 (2 constraints: 661111f2)
 com.ibm.icu:icu4j:62.1 (1 constraints: dd040c31)
 com.jayway.jsonpath:json-path:2.4.0 (1 constraints: 08050136)
-com.jcraft:jsch:0.1.53 (1 constraints: 790ef15e)
+com.jcraft:jsch:0.1.54 (2 constraints: 361cbfea)
 com.lmax:disruptor:3.4.0 (1 constraints: 09050636)
+com.nimbusds:nimbus-jose-jwt:4.41.1 (2 constraints: 6a1a5b39)
 com.pff:java-libpst:0.8.1 (2 constraints: 6a116bf2)
 com.rabbitmq:amqp-client:4.4.1 (1 constraints: c4108cb6)
 com.rometools:rome:1.5.1 (2 constraints: 661119f2)
 com.rometools:rome-utils:1.5.1 (2 constraints: e50d2f4b)
+com.squareup.okhttp:okhttp:2.7.5 (1 constraints: 5a0fe17e)
+com.squareup.okio:okio:1.6.0 (1 constraints: 1e0c1ff2)
 com.sun.istack:istack-commons-runtime:3.0.5 (1 constraints: 620c0806)
+com.sun.jersey:jersey-core:1.19.4 (9 constraints: cb92fe00)
+com.sun.jersey:jersey-json:1.19.4 (6 constraints: c96575cb)
+com.sun.jersey:jersey-server:1.19.4 (4 constraints: 7b36cc5e)
+com.sun.jersey:jersey-servlet:1.19.4 (3 constraints: 302258ea)
 com.sun.mail:gimap:1.5.1 (1 constraints: 09050036)
 com.sun.mail:javax.mail:1.5.1 (2 constraints: 830d2844)
+com.sun.xml.bind:jaxb-impl:2.2.3-1 (1 constraints: 330c2404)
 com.sun.xml.fastinfoset:FastInfoset:1.2.13 (1 constraints: ec0d9743)
 com.tdunning:t-digest:3.1 (1 constraints: a804212c)
-commons-beanutils:commons-beanutils:1.9.3 (3 constraints: 2a296cb5)
-commons-cli:commons-cli:1.2 (2 constraints: 161107d9)
-commons-codec:commons-codec:1.11 (4 constraints: 2d29e02a)
-commons-collections:commons-collections:3.2.2 (3 constraints: 9121ccda)
+com.thoughtworks.paranamer:paranamer:2.3 (1 constraints: ef08468a)
+commons-beanutils:commons-beanutils:1.9.3 (4 constraints: ba363323)
+commons-cli:commons-cli:1.2 (7 constraints: 9558c9e9)
+commons-codec:commons-codec:1.11 (9 constraints: b4729b8b)
+commons-collections:commons-collections:3.2.2 (5 constraints: 5e492db5)
 commons-fileupload:commons-fileupload:1.3.3 (1 constraints: 0905fc35)
-commons-io:commons-io:2.6 (4 constraints: 2e2d61f3)
+commons-io:commons-io:2.6 (11 constraints: d69cf8f3)
 commons-lang:commons-lang:2.6 (3 constraints: df29f552)
+commons-net:commons-net:3.6 (2 constraints: 341d98eb)
 de.l3s.boilerpipe:boilerpipe:1.1.0 (2 constraints: 5c1146f1)
 de.thetaphi:forbiddenapis:2.6 (1 constraints: ac04232c)
+dnsjava:dnsjava:2.1.7 (2 constraints: f21ddc52)
 edu.ucar:cdm:4.5.5 (3 constraints: 9d1abd7d)
 edu.ucar:grib:4.5.5 (1 constraints: 650c0402)
 edu.ucar:httpservices:4.5.5 (2 constraints: 8f122834)
 edu.ucar:netcdf4:4.5.5 (1 constraints: 650c0402)
 edu.ucar:udunits:4.5.5 (1 constraints: 2b06034e)
 edu.usc.ir:sentiment-analysis-parser:0.1 (1 constraints: fa0b50e9)
-io.dropwizard.metrics:metrics-core:4.0.5 (5 constraints: 204326bf)
+io.dropwizard.metrics:metrics-core:4.0.5 (6 constraints: 4f57c221)
 io.dropwizard.metrics:metrics-graphite:4.0.5 (1 constraints: 0b050436)
 io.dropwizard.metrics:metrics-jetty9:4.0.5 (1 constraints: 0b050436)
 io.dropwizard.metrics:metrics-jmx:4.0.5 (1 constraints: 0b050436)
 io.dropwizard.metrics:metrics-jvm:4.0.5 (1 constraints: 0b050436)
-io.netty:netty-all:4.1.29.Final (2 constraints: 2c177041)
+io.netty:netty-all:4.1.29.Final (3 constraints: 1e2636ab)
 io.opentracing:opentracing-api:0.33.0 (4 constraints: a62f7e64)
 io.opentracing:opentracing-mock:0.33.0 (1 constraints: 3805343b)
 io.opentracing:opentracing-noop:0.33.0 (3 constraints: 7c2142bd)
@@ -76,57 +88,69 @@ io.sgr:s2-geometry-library-java:1.0.0 (1 constraints: 0305f035)
 javax.activation:activation:1.1.1 (4 constraints: 692381b3)
 javax.annotation:javax.annotation-api:1.3 (1 constraints: f50e785e)
 javax.measure:unit-api:1.0 (5 constraints: 8e3e2cc5)
-javax.servlet:javax.servlet-api:3.1.0 (3 constraints: 75209943)
+javax.servlet:javax.servlet-api:3.1.0 (11 constraints: aab77804)
+javax.servlet.jsp:jsp-api:2.1 (1 constraints: 290d5a14)
 javax.ws.rs:javax.ws.rs-api:2.1 (1 constraints: f40e795e)
-javax.xml.bind:jaxb-api:2.3.0 (1 constraints: 5f0c0706)
+javax.ws.rs:jsr311-api:1.1.1 (2 constraints: b0213787)
+javax.xml.bind:jaxb-api:2.3.0 (8 constraints: c7909dd6)
 joda-time:joda-time:2.2 (2 constraints: 5d0d232c)
 junit:junit:4.12 (2 constraints: 3e1e6104)
 net.arnx:jsonic:1.2.7 (2 constraints: db10d4d1)
 net.java.dev.jna:jna:4.3.0 (1 constraints: 5e0cf901)
 net.jcip:jcip-annotations:1.0 (5 constraints: 6824b237)
 net.minidev:accessors-smart:1.2 (1 constraints: e60926a4)
-net.minidev:json-smart:2.3 (1 constraints: a40c49ff)
+net.minidev:json-smart:2.3 (3 constraints: 04272e32)
 net.sf.ehcache:ehcache-core:2.6.2 (1 constraints: 2706f94d)
 net.sourceforge.argparse4j:argparse4j:0.8.1 (1 constraints: 0b050436)
 net.sourceforge.nekohtml:nekohtml:1.9.17 (1 constraints: 4405503b)
 net.thisptr:jackson-jq:0.0.8 (1 constraints: 0a05f335)
 org.antlr:antlr4-runtime:4.5.1-1 (1 constraints: 6a05b240)
+org.apache.avro:avro:1.7.7 (7 constraints: 1884170b)
 org.apache.calcite:calcite-core:1.18.0 (1 constraints: 3c05413b)
 org.apache.calcite:calcite-linq4j:1.18.0 (1 constraints: 3c05413b)
 org.apache.calcite.avatica:avatica-core:1.13.0 (1 constraints: 3705323b)
 org.apache.commons:commons-collections4:4.2 (2 constraints: b90cdc15)
-org.apache.commons:commons-compress:1.18 (4 constraints: 2128b5ae)
-org.apache.commons:commons-csv:1.5 (1 constraints: ff0b57e9)
+org.apache.commons:commons-compress:1.18 (7 constraints: 674ed851)
+org.apache.commons:commons-configuration2:2.1.1 (2 constraints: 8d12092e)
+org.apache.commons:commons-csv:1.5 (2 constraints: 8f21f77f)
 org.apache.commons:commons-digester3:3.2 (2 constraints: 25274d81)
 org.apache.commons:commons-exec:1.3 (2 constraints: a41056b8)
-org.apache.commons:commons-lang3:3.8.1 (6 constraints: e755a5e0)
-org.apache.commons:commons-math3:3.6.1 (1 constraints: 0c050d36)
-org.apache.commons:commons-text:1.6 (1 constraints: ab04202c)
-org.apache.curator:curator-client:2.13.0 (1 constraints: 3805383b)
-org.apache.curator:curator-framework:2.13.0 (1 constraints: 3805383b)
-org.apache.curator:curator-recipes:2.13.0 (1 constraints: 3805383b)
+org.apache.commons:commons-lang3:3.8.1 (8 constraints: c47450ef)
+org.apache.commons:commons-math3:3.6.1 (2 constraints: 9412122f)
+org.apache.commons:commons-text:1.6 (2 constraints: d511b6f1)
+org.apache.curator:curator-client:2.13.0 (5 constraints: a4496710)
+org.apache.curator:curator-framework:2.13.0 (4 constraints: cd317cc0)
+org.apache.curator:curator-recipes:2.13.0 (3 constraints: 7f233592)
 org.apache.cxf:cxf-core:3.2.6 (3 constraints: 802c5bbf)
 org.apache.cxf:cxf-rt-frontend-jaxrs:3.2.6 (1 constraints: 360d1e28)
 org.apache.cxf:cxf-rt-rs-client:3.2.6 (1 constraints: 620cf701)
 org.apache.cxf:cxf-rt-transports-http:3.2.6 (2 constraints: 8f1c2e0b)
 org.apache.derby:derby:10.9.1.0 (1 constraints: 9b054946)
-org.apache.hadoop:hadoop-annotations:3.2.0 (1 constraints: 07050036)
-org.apache.hadoop:hadoop-auth:3.2.0 (1 constraints: 07050036)
-org.apache.hadoop:hadoop-common:3.2.0 (1 constraints: 07050036)
-org.apache.hadoop:hadoop-hdfs-client:3.2.0 (1 constraints: 07050036)
-org.apache.htrace:htrace-core4:4.1.0-incubating (1 constraints: 58090086)
-org.apache.httpcomponents:httpclient:4.5.6 (5 constraints: 2e39713a)
+org.apache.hadoop:hadoop-annotations:3.2.0 (18 constraints: 9544bb02)
+org.apache.hadoop:hadoop-auth:3.2.0 (4 constraints: 5d32c9d6)
+org.apache.hadoop:hadoop-common:3.2.0 (3 constraints: 1425a110)
+org.apache.hadoop:hadoop-hdfs-client:3.2.0 (4 constraints: 163abfa9)
+org.apache.htrace:htrace-core4:4.1.0-incubating (3 constraints: 262c6727)
+org.apache.httpcomponents:httpclient:4.5.6 (7 constraints: 7353f09a)
 org.apache.httpcomponents:httpcore:4.4.10 (4 constraints: ce250e79)
 org.apache.httpcomponents:httpmime:4.5.6 (3 constraints: 8e1b90af)
 org.apache.james:apache-mime4j-core:0.8.2 (2 constraints: 941abf66)
 org.apache.james:apache-mime4j-dom:0.8.2 (1 constraints: 610cf601)
-org.apache.kerby:kerb-core:1.0.1 (3 constraints: f11c583a)
-org.apache.kerby:kerb-crypto:1.0.1 (1 constraints: 860b05e6)
-org.apache.kerby:kerb-util:1.0.1 (1 constraints: 0405f135)
+org.apache.kerby:kerb-admin:1.0.1 (2 constraints: 8712012e)
+org.apache.kerby:kerb-client:1.0.1 (2 constraints: 8712012e)
+org.apache.kerby:kerb-common:1.0.1 (3 constraints: a81d2e73)
+org.apache.kerby:kerb-core:1.0.1 (6 constraints: 17449f90)
+org.apache.kerby:kerb-crypto:1.0.1 (3 constraints: d91ce535)
+org.apache.kerby:kerb-identity:1.0.1 (2 constraints: 621116f2)
+org.apache.kerby:kerb-server:1.0.1 (2 constraints: d410d1dc)
+org.apache.kerby:kerb-simplekdc:1.0.1 (3 constraints: 371fb2f7)
+org.apache.kerby:kerb-util:1.0.1 (3 constraints: 1a1ddb4c)
 org.apache.kerby:kerby-asn1:1.0.1 (2 constraints: 001155df)
-org.apache.kerby:kerby-config:1.0.1 (1 constraints: 860b05e6)
+org.apache.kerby:kerby-config:1.0.1 (5 constraints: 50365cd5)
 org.apache.kerby:kerby-pkix:1.0.1 (2 constraints: 741065ca)
 org.apache.kerby:kerby-util:1.0.1 (2 constraints: 6518bdb6)
+org.apache.kerby:kerby-xdr:1.0.1 (1 constraints: d10b65f2)
+org.apache.kerby:token-provider:1.0.1 (1 constraints: 470c5e01)
 org.apache.logging.log4j:log4j-1.2-api:2.11.2 (1 constraints: 3805343b)
 org.apache.logging.log4j:log4j-api:2.11.2 (4 constraints: c83394ae)
 org.apache.logging.log4j:log4j-core:2.11.2 (3 constraints: 102588ba)
@@ -160,7 +184,7 @@ org.apache.velocity.tools:velocity-tools-view:3.0 (2 constraints: 2019919a)
 org.apache.velocity.tools:velocity-tools-view-jsp:3.0 (1 constraints: a704202c)
 org.apache.ws.xmlschema:xmlschema-core:2.2.3 (1 constraints: 370a5abc)
 org.apache.xmlbeans:xmlbeans:3.0.1 (2 constraints: de126c41)
-org.apache.zookeeper:zookeeper:3.5.5 (1 constraints: 0f050e36)
+org.apache.zookeeper:zookeeper:3.5.5 (7 constraints: 6767b402)
 org.apache.zookeeper:zookeeper-jute:3.5.5 (2 constraints: 9b127823)
 org.aspectj:aspectjrt:1.8.0 (1 constraints: 0b050836)
 org.bitbucket.b_c:jose4j:0.6.5 (1 constraints: 0d050236)
@@ -175,9 +199,14 @@ org.carrot2:morfologik-stemming:2.1.5 (2 constraints: 0b12640c)
 org.carrot2.attributes:attributes-binder:1.3.3 (2 constraints: ab0f86a6)
 org.carrot2.shaded:carrot2-guava:18.0 (3 constraints: 8f202231)
 org.ccil.cowan.tagsoup:tagsoup:1.2.1 (2 constraints: 601198f1)
+org.codehaus.jackson:jackson-core-asl:1.9.13 (5 constraints: ea428e3d)
+org.codehaus.jackson:jackson-jaxrs:1.9.2 (1 constraints: da0befeb)
+org.codehaus.jackson:jackson-mapper-asl:1.9.13 (4 constraints: fa31b6d4)
+org.codehaus.jackson:jackson-xc:1.9.2 (1 constraints: da0befeb)
 org.codehaus.janino:commons-compiler:3.0.9 (2 constraints: d910f7d1)
 org.codehaus.janino:janino:3.0.9 (1 constraints: 0e050336)
-org.codehaus.woodstox:stax2-api:4.1 (3 constraints: f125f836)
+org.codehaus.jettison:jettison:1.1 (4 constraints: a84e24a9)
+org.codehaus.woodstox:stax2-api:4.1 (4 constraints: 7c331332)
 org.codehaus.woodstox:woodstox-core-asl:4.4.1 (1 constraints: 0b050c36)
 org.codelibs:jhighlight:1.0.3 (1 constraints: 5b0ce401)
 org.eclipse.jetty:jetty-alpn-client:9.4.19.v20190610 (3 constraints: d12c8400)
@@ -192,11 +221,11 @@ org.eclipse.jetty:jetty-io:9.4.19.v20190610 (8 constraints: 0f7eb132)
 org.eclipse.jetty:jetty-jmx:9.4.19.v20190610 (1 constraints: 8007517d)
 org.eclipse.jetty:jetty-rewrite:9.4.19.v20190610 (1 constraints: 8007517d)
 org.eclipse.jetty:jetty-security:9.4.19.v20190610 (2 constraints: ea172ade)
-org.eclipse.jetty:jetty-server:9.4.19.v20190610 (6 constraints: bd5e38f5)
-org.eclipse.jetty:jetty-servlet:9.4.19.v20190610 (2 constraints: 641789bf)
+org.eclipse.jetty:jetty-server:9.4.19.v20190610 (9 constraints: a59364a4)
+org.eclipse.jetty:jetty-servlet:9.4.19.v20190610 (3 constraints: 6327ea31)
 org.eclipse.jetty:jetty-servlets:9.4.19.v20190610 (1 constraints: 8007517d)
-org.eclipse.jetty:jetty-util:9.4.19.v20190610 (7 constraints: 77648009)
-org.eclipse.jetty:jetty-webapp:9.4.19.v20190610 (2 constraints: 72178fc0)
+org.eclipse.jetty:jetty-util:9.4.19.v20190610 (13 constraints: 71d56f29)
+org.eclipse.jetty:jetty-webapp:9.4.19.v20190610 (3 constraints: 7127f032)
 org.eclipse.jetty:jetty-xml:9.4.19.v20190610 (3 constraints: 56274720)
 org.eclipse.jetty.alpn:alpn-api:1.1.3.v20160715 (1 constraints: 6513848a)
 org.eclipse.jetty.http2:http2-client:9.4.19.v20190610 (2 constraints: 4d1ff83f)
@@ -225,16 +254,66 @@ org.ow2.asm:asm-analysis:6.2 (1 constraints: e309d6a5)
 org.ow2.asm:asm-commons:6.2 (1 constraints: aa04272c)
 org.ow2.asm:asm-tree:6.2 (2 constraints: 2d14228c)
 org.quartz-scheduler:quartz:2.2.0 (1 constraints: 2106eb4d)
-org.restlet.jee:org.restlet:2.3.0 (1 constraints: 0705fe35)
+org.restlet.jee:org.restlet:2.3.0 (2 constraints: e3159ee6)
 org.rrd4j:rrd4j:3.5 (1 constraints: ac04252c)
 org.simpleframework:simple-xml:2.7.1 (3 constraints: bd20563c)
 org.slf4j:jcl-over-slf4j:1.7.26 (3 constraints: 0018d6b7)
 org.slf4j:jul-to-slf4j:1.7.26 (2 constraints: d5113e11)
 org.slf4j:log4j-over-slf4j:1.7.26 (1 constraints: 4005473b)
-org.slf4j:slf4j-api:1.7.26 (30 constraints: b67286c8)
+org.slf4j:slf4j-api:1.7.26 (46 constraints: ac7b836b)
 org.tallison:jmatio:1.5 (2 constraints: a810a0b8)
 org.tukaani:xz:1.8 (2 constraints: ae100fb9)
+org.xerial.snappy:snappy-java:1.0.5 (1 constraints: 4e09a79c)
 org.yaml:snakeyaml:1.23 (1 constraints: 6e17f627)
 ua.net.nlp:morfologik-ukrainian-search:3.9.0 (1 constraints: 0e051536)
 xerces:xercesImpl:2.9.1 (2 constraints: f613d869)
 xml-apis:xml-apis:1.3.04 (1 constraints: b008af8c)
+
+[Test dependencies]
+aopalliance:aopalliance:1.0 (1 constraints: 170a83ac)
+com.cedarsoftware:java-util:1.9.0 (1 constraints: 670a3cba)
+com.cedarsoftware:json-io:2.5.1 (1 constraints: 3e0c9bfb)
+com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:2.9.8 (1 constraints: 52170526)
+com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.9.8 (1 constraints: 7b0f1281)
+com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.9.8 (2 constraints: cc2690c0)
+com.google.inject:guice:4.0 (7 constraints: 0089478e)
+com.google.inject.extensions:guice-servlet:4.0 (11 constraints: b3d51235)
+com.microsoft.sqlserver:mssql-jdbc:6.2.1.jre7 (1 constraints: de137765)
+com.sun.jersey:jersey-client:1.19.4 (5 constraints: f368021d)
+com.sun.jersey.contribs:jersey-guice:1.19 (4 constraints: 2953e7e4)
+com.zaxxer:HikariCP-java7:2.4.12 (1 constraints: 6812d417)
+commons-daemon:commons-daemon:1.0.13 (2 constraints: 641d7d3b)
+de.ruedigermoeller:fst:2.50 (1 constraints: 161af2be)
+io.netty:netty:3.10.5.Final (7 constraints: 02932566)
+javax.inject:javax.inject:1 (2 constraints: b018a173)
+net.bytebuddy:byte-buddy:1.9.3 (2 constraints: 2510faaf)
+net.bytebuddy:byte-buddy-agent:1.9.3 (1 constraints: 170b0fd3)
+org.apache.geronimo.specs:geronimo-jcache_1.0_spec:1.0-alpha-1 (1 constraints: 6314cf7b)
+org.apache.hadoop:hadoop-hdfs:3.2.0 (3 constraints: 1e2795fb)
+org.apache.hadoop:hadoop-mapreduce-client-app:3.2.0 (2 constraints: 18222bd9)
+org.apache.hadoop:hadoop-mapreduce-client-common:3.2.0 (4 constraints: fc4e9e5c)
+org.apache.hadoop:hadoop-mapreduce-client-core:3.2.0 (2 constraints: c6233b7b)
+org.apache.hadoop:hadoop-mapreduce-client-hs:3.2.0 (1 constraints: af0f9f84)
+org.apache.hadoop:hadoop-mapreduce-client-jobclient:3.2.0 (1 constraints: af0f9f84)
+org.apache.hadoop:hadoop-mapreduce-client-shuffle:3.2.0 (1 constraints: d012a32c)
+org.apache.hadoop:hadoop-minicluster:3.2.0 (1 constraints: 07050036)
+org.apache.hadoop:hadoop-minikdc:3.2.0 (1 constraints: 07050036)
+org.apache.hadoop:hadoop-yarn-api:3.2.0 (11 constraints: 94d09239)
+org.apache.hadoop:hadoop-yarn-client:3.2.0 (2 constraints: 4f277e01)
+org.apache.hadoop:hadoop-yarn-common:3.2.0 (11 constraints: c5d80876)
+org.apache.hadoop:hadoop-yarn-registry:3.2.0 (2 constraints: 5f26c282)
+org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:3.2.0 (2 constraints: e02bb5d8)
+org.apache.hadoop:hadoop-yarn-server-common:3.2.0 (7 constraints: fb935d70)
+org.apache.hadoop:hadoop-yarn-server-nodemanager:3.2.0 (2 constraints: 5926c78b)
+org.apache.hadoop:hadoop-yarn-server-resourcemanager:3.2.0 (1 constraints: de110ef2)
+org.apache.hadoop:hadoop-yarn-server-tests:3.2.0 (1 constraints: af0f9f84)
+org.apache.hadoop:hadoop-yarn-server-timelineservice:3.2.0 (1 constraints: de110ef2)
+org.apache.hadoop:hadoop-yarn-server-web-proxy:3.2.0 (2 constraints: bd28b177)
+org.apache.kerby:kerby-kdc:1.0.1 (1 constraints: 0405f135)
+org.eclipse.jetty:jetty-util-ajax:9.4.19.v20190610 (2 constraints: 802700bb)
+org.ehcache:ehcache:3.3.1 (1 constraints: 36126e05)
+org.fusesource.leveldbjni:leveldbjni-all:1.8 (7 constraints: 9f877bdf)
+org.locationtech.jts:jts-core:1.15.0 (1 constraints: 3905383b)
+org.mockito:mockito-core:2.23.4 (1 constraints: 3d05403b)
+org.objenesis:objenesis:2.6 (3 constraints: 3e293283)
+org.restlet.jee:org.restlet.ext.servlet:2.3.0 (1 constraints: 0705fe35)