You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by kr...@apache.org on 2022/09/19 13:44:25 UTC

[solr] branch main updated: SOLR-16410: Upgrade build tool versions (#1011)

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

krisden pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new dadf0f0b4e9 SOLR-16410: Upgrade build tool versions (#1011)
dadf0f0b4e9 is described below

commit dadf0f0b4e91148cbf62f00548f950a42adbbefd
Author: Kevin Risden <ri...@users.noreply.github.com>
AuthorDate: Mon Sep 19 09:44:17 2022 -0400

    SOLR-16410: Upgrade build tool versions (#1011)
    
    Upgrades across the build process.
    
    |Gradle Plugin Name|Old Version|New Version|
    |------------------|-----------|-----------|
    |com.palantir.consistent-versions|2.8.0|2.11.0|
    |org.owasp.dependencycheck|6.5.3|7.2.0|
    |ca.cutterslade.analyze|1.8.3|1.9.0|
    |de.undercouch.download|4.0.2|5.2.0|
    |com.github.node-gradle.node|3.1.1|3.4.0|
    |com.diffplug.spotless|6.3.0|6.5.2|
    
    |Build Tool Name|Old Version|New Version|
    |---------------|-----------|-----------|
    |Apache Rat|0.13|0.14|
    |ecj|3.28.0|3.30.0|
    |errorprone|2.14.0|2.15.0|
    |google java format|1.14.0|1.15.0|
    |groovy-all|3.0.9|3.0.12|
    |javacc|7.0.10|7.0.12|
    |jgit|5.13.0|5.13.1|
    |randomizedtesting|2.8.0|2.8.1|
    |spotbugs|4.5.3|4.7.2|
    
    Additional changes:
    * Fix remaining unusedDeclared warnings and make new findings build errors
    * Address new errorprone findings with either fixes or suppressions
---
 build.gradle                                       | 14 ++---
 buildSrc/scriptDepVersions.gradle                  |  8 +--
 gradle/validation/dependency-analyze.gradle        |  4 +-
 gradle/validation/error-prone.gradle               |  1 +
 gradle/validation/spotless.gradle                  |  7 ++-
 solr/core/build.gradle                             |  7 ++-
 .../src/java/org/apache/solr/core/SolrCore.java    |  5 +-
 .../java/org/apache/solr/parser/QueryParser.java   | 21 ++++----
 .../java/org/apache/solr/parser/TokenMgrError.java | 14 ++---
 .../test/org/apache/solr/cloud/MockSolrSource.java |  1 +
 .../OverseerCollectionConfigSetProcessorTest.java  | 24 +++++----
 .../error_prone_annotations-2.14.0.jar.sha1        |  1 -
 .../error_prone_annotations-2.15.0.jar.sha1        |  1 +
 .../randomizedtesting-runner-2.8.0.jar.sha1        |  1 -
 .../randomizedtesting-runner-2.8.1.jar.sha1        |  1 +
 solr/modules/clustering/build.gradle               |  1 -
 .../solr/hdfs/cloud/HdfsRecoverLeaseTest.java      | 60 ++++++----------------
 solr/modules/jwt-auth/build.gradle                 | 13 ++++-
 solr/packaging/build.gradle                        |  2 +-
 solr/prometheus-exporter/build.gradle              |  1 -
 solr/server/build.gradle                           |  2 +-
 solr/solrj/build.gradle                            |  1 -
 .../impl/CloudHttp2SolrClientBuilderTest.java      |  1 -
 .../solrj/io/stream/eval/AscEvaluatorTest.java     | 23 ++++-----
 versions.lock                                      | 10 ++--
 versions.props                                     |  6 +--
 26 files changed, 111 insertions(+), 119 deletions(-)

diff --git a/build.gradle b/build.gradle
index ba05d41b24c..cc0d3f2d271 100644
--- a/build.gradle
+++ b/build.gradle
@@ -20,14 +20,14 @@ import java.time.format.DateTimeFormatter
 
 plugins {
   id "base"
-  id "com.palantir.consistent-versions" version "2.8.0"
-  id "org.owasp.dependencycheck" version "6.5.3"
-  id 'ca.cutterslade.analyze' version "1.8.3"
+  id "com.palantir.consistent-versions" version "2.11.0"
+  id "org.owasp.dependencycheck" version "7.2.0"
+  id 'ca.cutterslade.analyze' version "1.9.0"
   id 'de.thetaphi.forbiddenapis' version '3.3' apply false
-  id "de.undercouch.download" version "4.0.2" apply false
+  id "de.undercouch.download" version "5.2.0" apply false
   id "net.ltgt.errorprone" version "2.0.2" apply false
-  id 'com.diffplug.spotless' version "6.3.0" apply false
-  id 'com.github.node-gradle.node' version '3.1.1' apply false
+  id 'com.diffplug.spotless' version "6.5.2" apply false
+  id 'com.github.node-gradle.node' version '3.4.0' apply false
 }
 
 apply from: file('gradle/globals.gradle')
@@ -108,7 +108,7 @@ configurations {
 
 dependencies {
   // Use a newer groovy that doesn't have illegal reflective accesses.
-  groovy "org.codehaus.groovy:groovy-all:3.0.9"
+  groovy "org.codehaus.groovy:groovy-all:3.0.12"
 }
 
 apply from: file('buildSrc/scriptDepVersions.gradle')
diff --git a/buildSrc/scriptDepVersions.gradle b/buildSrc/scriptDepVersions.gradle
index cdc130f11d6..802aa2a6275 100644
--- a/buildSrc/scriptDepVersions.gradle
+++ b/buildSrc/scriptDepVersions.gradle
@@ -21,11 +21,11 @@
 
 ext {
   scriptDepVersions = [
-      "apache-rat": "0.13",
+      "apache-rat": "0.14",
       "commons-codec": "1.15",
-      "ecj": "3.28.0",
-      "javacc": "7.0.10",
-      "jgit": "5.13.0.202109080827-r",
+      "ecj": "3.30.0",
+      "javacc": "7.0.12",
+      "jgit": "5.13.1.202206130422-r",
       "flexmark": "0.64.0",
   ]
 }
diff --git a/gradle/validation/dependency-analyze.gradle b/gradle/validation/dependency-analyze.gradle
index 55339e9c0af..1f35012ecf2 100644
--- a/gradle/validation/dependency-analyze.gradle
+++ b/gradle/validation/dependency-analyze.gradle
@@ -24,13 +24,13 @@ allprojects { prj ->
 
     analyzeClassesDependencies {
       warnUsedUndeclared = false // means fail build if UsedUndeclared found
-      warnUnusedDeclared = true // means only log warning if UnusedDeclared found
+      warnUnusedDeclared = false // means fail build if UnusedDeclared found
       logDependencyInformationToFiles = true
     }
 
     analyzeTestClassesDependencies {
       warnUsedUndeclared = false // means fail build if UsedUndeclared found
-      warnUnusedDeclared = true // means only log warning if UnusedDeclared found
+      warnUnusedDeclared = false // means fail build if UnusedDeclared found
       logDependencyInformationToFiles = true
     }
   })
diff --git a/gradle/validation/error-prone.gradle b/gradle/validation/error-prone.gradle
index 12f655f219e..9915d892398 100644
--- a/gradle/validation/error-prone.gradle
+++ b/gradle/validation/error-prone.gradle
@@ -84,6 +84,7 @@ allprojects { prj ->
             '-Xep:BadImport:OFF', // style preference that we don't want to enforce
             '-Xep:BadInstanceof:OFF',
             '-Xep:BadShiftAmount:OFF',
+            '-Xep:CanIgnoreReturnValueSuggester:OFF',
             '-Xep:ClassCanBeStatic:OFF',
             '-Xep:CollectionUndefinedEquality:OFF',
             '-Xep:ComplexBooleanConstant:OFF',
diff --git a/gradle/validation/spotless.gradle b/gradle/validation/spotless.gradle
index daee2561b2c..90bd625dce1 100644
--- a/gradle/validation/spotless.gradle
+++ b/gradle/validation/spotless.gradle
@@ -37,7 +37,7 @@ configure(project(":solr").subprojects) { prj ->
 
         lineEndings 'UNIX'
         endWithNewline()
-        googleJavaFormat('1.14.0')
+        googleJavaFormat('1.15.0')
 
         // Apply to all Java sources
         target "src/**/*.java"
@@ -82,6 +82,11 @@ configure(project(":solr").subprojects) { prj ->
     }
   }
 
+  // Emit a custom message about how to fix formatting errors.
+  tasks.matching { task -> task.name == "spotlessJavaCheck" }.configureEach {
+    runToFixMessage.set("\nIMPORTANT: run the top-level './gradlew tidy' to format code automatically (see help/formatting.txt for more info).")
+  }
+
   // Add an alias to 'spotlessApply' simply called 'tidy' and wire up
   // spotlessCheck to convention's check.
   task tidy() {
diff --git a/solr/core/build.gradle b/solr/core/build.gradle
index a97563a8827..2f9a0c14abb 100644
--- a/solr/core/build.gradle
+++ b/solr/core/build.gradle
@@ -81,9 +81,12 @@ dependencies {
 
   implementation 'javax.servlet:javax.servlet-api'
 
-  implementation "org.glassfish.jersey.containers:jersey-container-jetty-http"
+  implementation 'org.glassfish.jersey.containers:jersey-container-jetty-http'
+  permitUnusedDeclared 'org.glassfish.jersey.containers:jersey-container-jetty-http'
   implementation 'org.glassfish.jersey.inject:jersey-hk2'
+  permitUnusedDeclared 'org.glassfish.jersey.inject:jersey-hk2'
   implementation 'org.glassfish.jersey.media:jersey-media-json-jackson'
+  permitUnusedDeclared 'org.glassfish.jersey.media:jersey-media-json-jackson'
   implementation 'org.glassfish.jersey.core:jersey-common'
   implementation 'org.glassfish.jersey.core:jersey-server'
   implementation 'org.glassfish.hk2:hk2-api'
@@ -98,6 +101,7 @@ dependencies {
   runtimeOnly "org.apache.lucene:lucene-backward-codecs"
   implementation "org.apache.lucene:lucene-codecs"
   implementation "org.apache.lucene:lucene-backward-codecs"
+  permitUnusedDeclared "org.apache.lucene:lucene-backward-codecs"
   implementation "org.apache.lucene:lucene-classification"
   implementation "org.apache.lucene:lucene-expressions"
   implementation "org.apache.lucene:lucene-grouping"
@@ -194,6 +198,7 @@ dependencies {
 
   testImplementation 'org.glassfish.jersey.test-framework:jersey-test-framework-core'
   testImplementation 'org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-grizzly2'
+  permitTestUnusedDeclared 'org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-grizzly2'
 
 
   testImplementation('org.mockito:mockito-core', {
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index 6efeef06a25..8423b192b7f 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -1008,8 +1008,7 @@ public class SolrCore implements SolrInfoBean, Closeable {
     }
   }
 
-  public <T extends Object> T createInitInstance(
-      PluginInfo info, Class<T> cast, String msg, String defClassName) {
+  public <T> T createInitInstance(PluginInfo info, Class<T> cast, String msg, String defClassName) {
     if (info == null) return null;
     T o =
         createInstance(
@@ -1021,7 +1020,7 @@ public class SolrCore implements SolrInfoBean, Closeable {
     return initPlugin(info, o);
   }
 
-  public static <T extends Object> T initPlugin(PluginInfo info, T o) {
+  public static <T> T initPlugin(PluginInfo info, T o) {
     if (o instanceof PluginInfoInitialized) {
       ((PluginInfoInitialized) o).init(info);
     } else if (o instanceof NamedListInitializedPlugin) {
diff --git a/solr/core/src/java/org/apache/solr/parser/QueryParser.java b/solr/core/src/java/org/apache/solr/parser/QueryParser.java
index 67fa3b7a162..f1fb211c94d 100644
--- a/solr/core/src/java/org/apache/solr/parser/QueryParser.java
+++ b/solr/core/src/java/org/apache/solr/parser/QueryParser.java
@@ -2,14 +2,6 @@
 /* Generated By:JavaCC: Do not edit this line. QueryParser.java */
 package org.apache.solr.parser;
 
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.queryparser.charstream.CharStream;
-import org.apache.lucene.queryparser.charstream.FastCharStream;
-import org.apache.lucene.search.BooleanClause;
-import org.apache.lucene.search.Query;
-import org.apache.solr.search.QParser;
-import org.apache.solr.search.SyntaxError;
-
 import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -17,6 +9,15 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.Query;
+import org.apache.solr.search.SyntaxError;
+import org.apache.solr.search.QParser;
+
+import org.apache.lucene.queryparser.charstream.CharStream;
+import org.apache.lucene.queryparser.charstream.FastCharStream;
+
 public class QueryParser extends SolrQueryParserBase implements QueryParserConstants {
   /** The default operator for parsing queries.
    */
@@ -833,8 +834,8 @@ if (splitOnWhitespace == false) {
       return this;
     }
   }
-    @SuppressWarnings("StaticAssignmentOfThrowable")
-    static private final LookaheadSuccess jj_ls = new LookaheadSuccess();
+  @SuppressWarnings("StaticAssignmentOfThrowable")
+  static private final LookaheadSuccess jj_ls = new LookaheadSuccess();
   private boolean jj_scan_token(int kind) {
      if (jj_scanpos == jj_lastpos) {
        jj_la--;
diff --git a/solr/core/src/java/org/apache/solr/parser/TokenMgrError.java b/solr/core/src/java/org/apache/solr/parser/TokenMgrError.java
index 609c572de27..085a4928211 100644
--- a/solr/core/src/java/org/apache/solr/parser/TokenMgrError.java
+++ b/solr/core/src/java/org/apache/solr/parser/TokenMgrError.java
@@ -95,7 +95,7 @@ public class TokenMgrError extends Error
    * token manager to indicate a lexical error.
    * Parameters :
    *    EOFSeen     : indicates if EOF caused the lexical error
-   *    curLexState : lexical state in which this error occurred
+   *    lexState    : lexical state in which this error occurred
    *    errorLine   : line number when the error occurred
    *    errorColumn : column number when the error occurred
    *    errorAfter  : prefix that was seen before this error occurred
@@ -103,12 +103,12 @@ public class TokenMgrError extends Error
    * Note: You can customize the lexical error message by modifying this method.
    */
   protected static String LexicalErr(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, int curChar) {
-    char curChar1 = (char)curChar;
-    return("Lexical error at line " +
-          errorLine + ", column " +
-          errorColumn + ".  Encountered: " +
-          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar1)) + "\"") + " (" + curChar + "), ") +
-          "after : \"" + addEscapes(errorAfter) + "\"");
+    return("Lexical error at line " + //
+          errorLine + ", column " + //
+          errorColumn + ".  Encountered: " + //
+          (EOFSeen ? "<EOF>" : ("'" + addEscapes(String.valueOf(curChar)) + "' (" + curChar + "),")) + //
+          (errorAfter == null || errorAfter.length() == 0 ? "" : " after prefix \"" + addEscapes(errorAfter) + "\"")) + //
+          (lexState == 0 ? "" : " (in lexical state " + lexState + ")");
   }
 
   /**
diff --git a/solr/core/src/test/org/apache/solr/cloud/MockSolrSource.java b/solr/core/src/test/org/apache/solr/cloud/MockSolrSource.java
index 804983c71b4..37a79777525 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MockSolrSource.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MockSolrSource.java
@@ -24,6 +24,7 @@ import org.apache.solr.common.cloud.ZkStateReader;
 
 public class MockSolrSource {
 
+  @SuppressWarnings("DirectInvocationOnMock")
   public static ZkController makeSimpleMock(
       Overseer overseer, ZkStateReader reader, SolrZkClient zkClient) {
     ZkController zkControllerMock = mock(ZkController.class);
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerCollectionConfigSetProcessorTest.java b/solr/core/src/test/org/apache/solr/cloud/OverseerCollectionConfigSetProcessorTest.java
index c59f1195b66..cf10c16406f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerCollectionConfigSetProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerCollectionConfigSetProcessorTest.java
@@ -134,7 +134,7 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
   private static SolrMetricsContext solrMetricsContextMock;
 
   private static ObjectCache objectCache;
-  private Map<String, byte[]> zkClientData = new HashMap<>();
+  private final Map<String, byte[]> zkClientData = new HashMap<>();
   private final Map<String, ClusterState.CollectionRef> collectionsSet = new HashMap<>();
   private final List<ZkNodeProps> replicas = new ArrayList<>();
   private SolrResponse lastProcessMessageResult;
@@ -142,7 +142,7 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
   private OverseerCollectionConfigSetProcessorToBeTested underTest;
 
   private Thread thread;
-  private Queue<QueueEvent> queue = new ArrayBlockingQueue<>(10);
+  private final Queue<QueueEvent> queue = new ArrayBlockingQueue<>(10);
 
   private static class OverseerCollectionConfigSetProcessorToBeTested
       extends OverseerCollectionConfigSetProcessor {
@@ -282,7 +282,7 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
     super.tearDown();
   }
 
-  @SuppressWarnings("unchecked")
+  @SuppressWarnings({"DirectInvocationOnMock", "unchecked"})
   protected Set<String> commonMocks(int liveNodesCount, boolean distributedClusterStateUpdates)
       throws Exception {
     when(shardHandlerFactoryMock.getShardHandler()).thenReturn(shardHandlerMock);
@@ -297,7 +297,7 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
                 if (count > 1) return null;
               }
 
-              return Arrays.asList(result);
+              return List.of(result);
             });
 
     when(workQueueMock.getTailId())
@@ -506,7 +506,8 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
     Mockito.doAnswer(
             new Answer<Void>() {
               public Void answer(InvocationOnMock invocation) {
-                System.out.println("set data: " + invocation.getArgument(0) + " " + new byte[0]);
+                System.out.println(
+                    "set data: " + invocation.getArgument(0) + " " + Arrays.toString(new byte[0]));
                 zkClientData.put(invocation.getArgument(0), new byte[0]);
                 return null;
               }
@@ -570,10 +571,12 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
                 public Void answer(InvocationOnMock invocation) {
                   try {
                     handleCreateCollMessage(invocation.getArgument(0));
-                    stateUpdateQueueMock.offer(invocation.getArgument(0));
+                    verify(stateUpdateQueueMock, Mockito.atLeast(0))
+                        .offer(invocation.getArgument(0));
                   } catch (KeeperException e) {
                     throw new RuntimeException(e);
                   } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
                     throw new RuntimeException(e);
                   }
                   return null;
@@ -678,6 +681,7 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
         replicas.add(props);
       }
     } catch (Exception e) {
+      log.error("Ignored exception", e);
     }
   }
 
@@ -788,7 +792,7 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
           "Shard " + coreName + " created on wrong node " + shardRequest.shards[0],
           nodeUrlWithoutProtocolPartForLiveNodes.contains(shardRequest.shards[0]));
       coreName_TO_nodeUrlWithoutProtocolPartForLiveNodes_map.put(coreName, shardRequest.shards[0]);
-      assertEquals(shardRequest.shards, shardRequest.actualShards);
+      assertArrayEquals(shardRequest.shards, shardRequest.actualShards);
 
       String sliceName = shardRequest.params.get(CoreAdminParams.SHARD);
       if (!sliceToNodeUrlsWithoutProtocolPartToNumberOfShardsRunningMapMap.containsKey(sliceName)) {
@@ -831,9 +835,8 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
         numberOfSlices.intValue(),
         sliceToNodeUrlsWithoutProtocolPartToNumberOfShardsRunningMapMap.size());
     for (int i = 1; i <= numberOfSlices; i++) {
-      sliceToNodeUrlsWithoutProtocolPartToNumberOfShardsRunningMapMap
-          .keySet()
-          .contains("shard" + i);
+      assertTrue(
+          sliceToNodeUrlsWithoutProtocolPartToNumberOfShardsRunningMapMap.containsKey("shard" + i));
     }
     int minShardsPerSlicePerNode = numberOfReplica / createNodes.size();
     int numberOfNodesSupposedToRunMaxShards = numberOfReplica % createNodes.size();
@@ -905,6 +908,7 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
     SEND_NULL
   }
 
+  @SuppressWarnings("DirectInvocationOnMock")
   protected void testTemplate(
       Integer numberOfNodes,
       Integer numberOfNodesToCreateOn,
diff --git a/solr/licenses/error_prone_annotations-2.14.0.jar.sha1 b/solr/licenses/error_prone_annotations-2.14.0.jar.sha1
deleted file mode 100644
index 7f102a60197..00000000000
--- a/solr/licenses/error_prone_annotations-2.14.0.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9f01b3654d3c536859705f09f8d267ee977b4004
diff --git a/solr/licenses/error_prone_annotations-2.15.0.jar.sha1 b/solr/licenses/error_prone_annotations-2.15.0.jar.sha1
new file mode 100644
index 00000000000..1d051d4a495
--- /dev/null
+++ b/solr/licenses/error_prone_annotations-2.15.0.jar.sha1
@@ -0,0 +1 @@
+38c8485a652f808c8c149150da4e5c2b0bd17f9a
diff --git a/solr/licenses/randomizedtesting-runner-2.8.0.jar.sha1 b/solr/licenses/randomizedtesting-runner-2.8.0.jar.sha1
deleted file mode 100644
index a6b0aaa5121..00000000000
--- a/solr/licenses/randomizedtesting-runner-2.8.0.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-631ae08801457db4398d0b376305d0cdab357a60
diff --git a/solr/licenses/randomizedtesting-runner-2.8.1.jar.sha1 b/solr/licenses/randomizedtesting-runner-2.8.1.jar.sha1
new file mode 100644
index 00000000000..f284774194e
--- /dev/null
+++ b/solr/licenses/randomizedtesting-runner-2.8.1.jar.sha1
@@ -0,0 +1 @@
+55ffe691e90d31ab916746516654b5701e532d6f
diff --git a/solr/modules/clustering/build.gradle b/solr/modules/clustering/build.gradle
index 652a7d60528..fa0811dda7d 100644
--- a/solr/modules/clustering/build.gradle
+++ b/solr/modules/clustering/build.gradle
@@ -29,7 +29,6 @@ dependencies {
   implementation 'org.slf4j:slf4j-api'
 
   testImplementation project(':solr:test-framework')
-  testImplementation 'org.apache.lucene:lucene-test-framework'
   testImplementation 'com.carrotsearch.randomizedtesting:randomizedtesting-runner'
   testImplementation 'junit:junit'
   testImplementation 'org.hamcrest:hamcrest'
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRecoverLeaseTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRecoverLeaseTest.java
index c2ac1acae73..c69b6ad7571 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRecoverLeaseTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRecoverLeaseTest.java
@@ -32,7 +32,6 @@ import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.hdfs.util.BadHdfsThreadsFilter;
 import org.apache.solr.hdfs.util.HdfsRecoverLeaseFileSystemUtils;
-import org.apache.solr.hdfs.util.HdfsRecoverLeaseFileSystemUtils.CallerInfo;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -85,24 +84,14 @@ public class HdfsRecoverLeaseTest extends SolrTestCaseJ4 {
     Path path = new Path(uri);
     Configuration conf = HdfsTestUtil.getClientConfiguration(dfsCluster);
     FileSystem fs1 = FileSystem.get(path.toUri(), conf);
-    Path testFile = new Path(uri.toString() + "/testfile");
+    Path testFile = new Path(uri + "/testfile");
     FSDataOutputStream out = fs1.create(testFile);
 
     out.write(5);
     out.hflush();
     out.close();
 
-    HdfsRecoverLeaseFileSystemUtils.recoverFileLease(
-        fs1,
-        testFile,
-        conf,
-        new CallerInfo() {
-
-          @Override
-          public boolean isCallerClosed() {
-            return false;
-          }
-        });
+    HdfsRecoverLeaseFileSystemUtils.recoverFileLease(fs1, testFile, conf, () -> false);
     assertEquals(
         0,
         HdfsRecoverLeaseFileSystemUtils.RECOVER_LEASE_SUCCESS_COUNT.get()
@@ -111,7 +100,7 @@ public class HdfsRecoverLeaseTest extends SolrTestCaseJ4 {
     fs1.close();
 
     FileSystem fs2 = FileSystem.get(path.toUri(), conf);
-    Path testFile2 = new Path(uri.toString() + "/testfile2");
+    Path testFile2 = new Path(uri + "/testfile2");
     FSDataOutputStream out2 = fs2.create(testFile2);
 
     if (random().nextBoolean()) {
@@ -127,17 +116,7 @@ public class HdfsRecoverLeaseTest extends SolrTestCaseJ4 {
 
     FileSystem fs3 = FileSystem.get(path.toUri(), conf);
 
-    HdfsRecoverLeaseFileSystemUtils.recoverFileLease(
-        fs3,
-        testFile2,
-        conf,
-        new CallerInfo() {
-
-          @Override
-          public boolean isCallerClosed() {
-            return false;
-          }
-        });
+    HdfsRecoverLeaseFileSystemUtils.recoverFileLease(fs3, testFile2, conf, () -> false);
     assertEquals(
         1,
         HdfsRecoverLeaseFileSystemUtils.RECOVER_LEASE_SUCCESS_COUNT.get()
@@ -148,6 +127,7 @@ public class HdfsRecoverLeaseTest extends SolrTestCaseJ4 {
   }
 
   @Test
+  @SuppressWarnings("DoNotCall")
   public void testMultiThreaded() throws Exception {
     long startRecoverLeaseSuccessCount =
         HdfsRecoverLeaseFileSystemUtils.RECOVER_LEASE_SUCCESS_COUNT.get();
@@ -158,8 +138,8 @@ public class HdfsRecoverLeaseTest extends SolrTestCaseJ4 {
 
     // n threads create files
     class WriterThread extends Thread {
-      private FileSystem fs;
-      private int id;
+      private final FileSystem fs;
+      private final int id;
 
       public WriterThread(int id) {
         this.id = id;
@@ -172,7 +152,7 @@ public class HdfsRecoverLeaseTest extends SolrTestCaseJ4 {
 
       @Override
       public void run() {
-        Path testFile = new Path(uri.toString() + "/file-" + id);
+        Path testFile = new Path(uri + "/file-" + id);
         FSDataOutputStream out;
         try {
           out = fs.create(testFile);
@@ -199,8 +179,8 @@ public class HdfsRecoverLeaseTest extends SolrTestCaseJ4 {
     }
 
     class RecoverThread extends Thread {
-      private FileSystem fs;
-      private int id;
+      private final FileSystem fs;
+      private final int id;
 
       public RecoverThread(int id) {
         this.id = id;
@@ -213,19 +193,9 @@ public class HdfsRecoverLeaseTest extends SolrTestCaseJ4 {
 
       @Override
       public void run() {
-        Path testFile = new Path(uri.toString() + "/file-" + id);
+        Path testFile = new Path(uri + "/file-" + id);
         try {
-          HdfsRecoverLeaseFileSystemUtils.recoverFileLease(
-              fs,
-              testFile,
-              conf,
-              new CallerInfo() {
-
-                @Override
-                public boolean isCallerClosed() {
-                  return false;
-                }
-              });
+          HdfsRecoverLeaseFileSystemUtils.recoverFileLease(fs, testFile, conf, () -> false);
         } catch (IOException e) {
           throw new RuntimeException(e);
         }
@@ -236,13 +206,14 @@ public class HdfsRecoverLeaseTest extends SolrTestCaseJ4 {
       }
     }
 
-    Set<WriterThread> writerThreads = new HashSet<WriterThread>();
-    Set<RecoverThread> recoverThreads = new HashSet<RecoverThread>();
+    Set<WriterThread> writerThreads = new HashSet<>();
+    Set<RecoverThread> recoverThreads = new HashSet<>();
 
     int threadCount = 3;
     for (int i = 0; i < threadCount; i++) {
       WriterThread wt = new WriterThread(i);
       writerThreads.add(wt);
+      // should be wt.start();
       wt.run();
     }
 
@@ -255,6 +226,7 @@ public class HdfsRecoverLeaseTest extends SolrTestCaseJ4 {
     for (WriterThread wt : writerThreads) {
       RecoverThread rt = new RecoverThread(wt.getFileId());
       recoverThreads.add(rt);
+      // should be rt.start();
       rt.run();
     }
 
diff --git a/solr/modules/jwt-auth/build.gradle b/solr/modules/jwt-auth/build.gradle
index 9e137e1bced..92fae20b085 100644
--- a/solr/modules/jwt-auth/build.gradle
+++ b/solr/modules/jwt-auth/build.gradle
@@ -19,7 +19,17 @@ apply plugin: 'java-library'
 
 description = 'JWT / OpenID Connect / OAuth2 authentication plugin'
 
+// This is a hacky way to use permitTestUnusedDeclared with bom declared dependencies.
+// See https://github.com/gradle-dependency-analyze/gradle-dependency-analyze/issues/108
+configurations {
+  constraintsOnly
+  permitTestUnusedDeclared.extendsFrom constraintsOnly
+  implementation.extendsFrom constraintsOnly
+}
+
 dependencies {
+  constraintsOnly(platform("com.fasterxml.jackson:jackson-bom"))
+
   implementation project(':solr:core')
   implementation project(':solr:solrj')
 
@@ -48,8 +58,7 @@ dependencies {
   })
   // required by mock-oauth2-server
   testImplementation 'com.fasterxml.jackson.core:jackson-databind'
-  // Not working currently https://github.com/gradle-dependency-analyze/gradle-dependency-analyze/issues/108
-  //permitTestUnusedDeclared 'com.fasterxml.jackson.core:jackson-databind'
+  permitTestUnusedDeclared 'com.fasterxml.jackson.core:jackson-databind'
 
   testImplementation 'com.nimbusds:nimbus-jose-jwt'
   testImplementation 'com.squareup.okhttp3:mockwebserver'
diff --git a/solr/packaging/build.gradle b/solr/packaging/build.gradle
index 6b993add6a5..095c9ccb6ca 100644
--- a/solr/packaging/build.gradle
+++ b/solr/packaging/build.gradle
@@ -223,4 +223,4 @@ class BatsTask extends Exec {
 
     super.exec()
   }
-}
\ No newline at end of file
+}
diff --git a/solr/prometheus-exporter/build.gradle b/solr/prometheus-exporter/build.gradle
index 8d7e5d9418e..4a91969e4a9 100644
--- a/solr/prometheus-exporter/build.gradle
+++ b/solr/prometheus-exporter/build.gradle
@@ -43,7 +43,6 @@ dependencies {
 
   testImplementation project(':solr:core')
   testImplementation project(':solr:test-framework')
-  testImplementation 'org.apache.lucene:lucene-test-framework'
   testImplementation 'com.carrotsearch.randomizedtesting:randomizedtesting-runner'
   testImplementation 'junit:junit'
 
diff --git a/solr/server/build.gradle b/solr/server/build.gradle
index c5e715cecc1..7ff587adea5 100644
--- a/solr/server/build.gradle
+++ b/solr/server/build.gradle
@@ -136,4 +136,4 @@ artifacts {
   }
 }
 
-assemble.dependsOn assemblePackaging
\ No newline at end of file
+assemble.dependsOn assemblePackaging
diff --git a/solr/solrj/build.gradle b/solr/solrj/build.gradle
index 36d4035c84f..f12ef45703c 100644
--- a/solr/solrj/build.gradle
+++ b/solr/solrj/build.gradle
@@ -51,7 +51,6 @@ dependencies {
   testImplementation 'org.apache.zookeeper:zookeeper'
   permitTestUnusedDeclared 'org.apache.zookeeper:zookeeper'
 
-  testImplementation 'org.apache.lucene:lucene-analysis-common'
   testImplementation 'org.apache.lucene:lucene-core'
   testImplementation 'org.apache.lucene:lucene-test-framework'
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientBuilderTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientBuilderTest.java
index 266d05377bf..8a4877f5142 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientBuilderTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientBuilderTest.java
@@ -160,6 +160,5 @@ public class CloudHttp2SolrClientBuilderTest extends SolrTestCase {
     }
     // it's external, should be NOT closed when closing CloudSolrClient
     verify(http2Client, never()).close();
-    http2Client.close();
   }
 }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/eval/AscEvaluatorTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/eval/AscEvaluatorTest.java
index 0a1230123d1..637bb8ca68d 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/eval/AscEvaluatorTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/eval/AscEvaluatorTest.java
@@ -20,7 +20,6 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import junit.framework.Assert;
 import org.apache.solr.SolrTestCase;
 import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.io.eval.AscEvaluator;
@@ -49,8 +48,8 @@ public class AscEvaluatorTest extends SolrTestCase {
     values.clear();
     values.put("a", Arrays.asList(2, 4, 1, 3, 5, 8, 7));
     result = evaluator.evaluate(new Tuple(values));
-    Assert.assertTrue(result instanceof List<?>);
-    Assert.assertEquals(7, ((List<?>) result).size());
+    assertTrue(result instanceof List<?>);
+    assertEquals(7, ((List<?>) result).size());
     checkOrder(Arrays.asList(1D, 2D, 3D, 4D, 5D, 7D, 8D), (List<Object>) result);
   }
 
@@ -63,8 +62,8 @@ public class AscEvaluatorTest extends SolrTestCase {
     values.clear();
     values.put("a", Arrays.asList(2.3, 2.1, 2.7, 2.6, 2.5));
     result = evaluator.evaluate(new Tuple(values));
-    Assert.assertTrue(result instanceof List<?>);
-    Assert.assertEquals(5, ((List<?>) result).size());
+    assertTrue(result instanceof List<?>);
+    assertEquals(5, ((List<?>) result).size());
     checkOrder(Arrays.asList(2.1, 2.3, 2.5, 2.6, 2.7), (List<Object>) result);
   }
 
@@ -77,8 +76,8 @@ public class AscEvaluatorTest extends SolrTestCase {
     values.clear();
     values.put("a", Arrays.asList(2.3, 2.1, 2.0, 2.7, 2.6, 2.5, 3));
     result = evaluator.evaluate(new Tuple(values));
-    Assert.assertTrue(result instanceof List<?>);
-    Assert.assertEquals(7, ((List<?>) result).size());
+    assertTrue(result instanceof List<?>);
+    assertEquals(7, ((List<?>) result).size());
     checkOrder(Arrays.asList(2D, 2.1, 2.3, 2.5, 2.6, 2.7, 3D), (List<Object>) result);
   }
 
@@ -91,20 +90,20 @@ public class AscEvaluatorTest extends SolrTestCase {
     values.clear();
     values.put("a", Arrays.asList("a", "c", "b", "e", "d"));
     result = evaluator.evaluate(new Tuple(values));
-    Assert.assertTrue(result instanceof List<?>);
-    Assert.assertEquals(5, ((List<?>) result).size());
+    assertTrue(result instanceof List<?>);
+    assertEquals(5, ((List<?>) result).size());
     checkOrder(Arrays.asList("a", "b", "c", "d", "e"), (List<Object>) result);
   }
 
-  private <T> void checkOrder(List<?> expected, List<?> actual) {
-    Assert.assertEquals(expected.size(), actual.size());
+  private void checkOrder(List<?> expected, List<?> actual) {
+    assertEquals(expected.size(), actual.size());
     for (int idx = 0; idx < expected.size(); ++idx) {
       @SuppressWarnings({"unchecked"})
       Comparable<Object> expectedValue = (Comparable<Object>) expected.get(idx);
       @SuppressWarnings({"unchecked"})
       Comparable<Object> actualValue = (Comparable<Object>) actual.get(idx);
 
-      Assert.assertEquals(0, expectedValue.compareTo(actualValue));
+      assertEquals(0, expectedValue.compareTo(actualValue));
     }
   }
 }
diff --git a/versions.lock b/versions.lock
index fe7351f9d14..437aecb4186 100644
--- a/versions.lock
+++ b/versions.lock
@@ -2,7 +2,7 @@
 com.adobe.xmp:xmpcore:6.1.10 (1 constraints: fd0d5947)
 com.beust:jcommander:1.82 (2 constraints: 2b123714)
 com.carrotsearch:hppc:0.9.1 (2 constraints: ad0fc9a6)
-com.carrotsearch.randomizedtesting:randomizedtesting-runner:2.8.0 (2 constraints: cd15cfe1)
+com.carrotsearch.randomizedtesting:randomizedtesting-runner:2.8.1 (2 constraints: ce1500e2)
 com.cybozu.labs:langdetect:1.1-20120112 (1 constraints: 5c066d5e)
 com.epam:parso:2.0.14 (1 constraints: 8e0c750e)
 com.esri.geometry:esri-geometry-api:2.2.0 (1 constraints: 5c0db22c)
@@ -17,7 +17,7 @@ com.github.ben-manes.caffeine:caffeine:3.1.1 (1 constraints: 0705fe35)
 com.github.jai-imageio:jai-imageio-core:1.4.0 (1 constraints: 5c0ced01)
 com.github.junrar:junrar:7.5.2 (1 constraints: 650c1002)
 com.github.openjson:openjson:1.0.12 (1 constraints: 8b0c6d0e)
-com.github.spotbugs:spotbugs-annotations:4.5.3 (1 constraints: 0e051136)
+com.github.spotbugs:spotbugs-annotations:4.7.2 (1 constraints: 0f051636)
 com.github.virtuald:curvesapi:1.07 (1 constraints: 9e0ac7c0)
 com.github.zafarkhaja:java-semver:0.9.0 (1 constraints: 0b050636)
 com.google.api:api-common:2.2.1 (5 constraints: 8543fda1)
@@ -35,7 +35,7 @@ com.google.cloud:google-cloud-core:2.8.6 (3 constraints: cc2e39e1)
 com.google.cloud:google-cloud-core-http:2.8.6 (1 constraints: f40ff795)
 com.google.cloud:google-cloud-storage:2.11.3 (2 constraints: cf1cb826)
 com.google.code.gson:gson:2.9.1 (6 constraints: de586bc0)
-com.google.errorprone:error_prone_annotations:2.14.0 (4 constraints: 5e3861e5)
+com.google.errorprone:error_prone_annotations:2.15.0 (4 constraints: 5e3861e5)
 com.google.guava:failureaccess:1.0.1 (2 constraints: f9199e37)
 com.google.guava:guava:31.1-jre (17 constraints: 7c0afe78)
 com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava (2 constraints: 4b35b0a0)
@@ -153,7 +153,7 @@ org.apache.kerby:kerby-pkix:1.0.1 (1 constraints: 710bfce4)
 org.apache.kerby:kerby-util:1.0.1 (2 constraints: 6518bdb6)
 org.apache.logging.log4j:log4j-1.2-api:2.17.2 (1 constraints: 3e05463b)
 org.apache.logging.log4j:log4j-api:2.17.2 (9 constraints: 886f1688)
-org.apache.logging.log4j:log4j-core:2.17.2 (4 constraints: 8b390a2a)
+org.apache.logging.log4j:log4j-core:2.17.2 (5 constraints: 6f55c3ab)
 org.apache.logging.log4j:log4j-layout-template-json:2.17.2 (1 constraints: 3e05463b)
 org.apache.logging.log4j:log4j-slf4j-impl:2.17.2 (1 constraints: 3e05463b)
 org.apache.logging.log4j:log4j-web:2.17.2 (1 constraints: 3e05463b)
@@ -271,7 +271,7 @@ org.itadaki:bzip2:0.9.1 (2 constraints: bd0c4b2c)
 org.javassist:javassist:3.25.0-GA (1 constraints: 2a110ef1)
 org.jctools:jctools-core:3.3.0 (1 constraints: 08050336)
 org.jdom:jdom2:2.0.6.1 (1 constraints: be0c371b)
-org.junit:junit-bom:5.8.2 (1 constraints: c8116cde)
+org.junit:junit-bom:5.9.0 (1 constraints: c7116dde)
 org.locationtech.spatial4j:spatial4j:0.8 (1 constraints: 59105498)
 org.opengis:geoapi:3.0.1 (7 constraints: 1361d046)
 org.openjdk.jmh:jmh-core:1.32 (1 constraints: da04f730)
diff --git a/versions.props b/versions.props
index 212d8d04299..8fbf4266f70 100644
--- a/versions.props
+++ b/versions.props
@@ -1,14 +1,14 @@
 com.adobe.testing:s3mock-junit4=2.1.34
-com.carrotsearch.randomizedtesting:*=2.8.0
+com.carrotsearch.randomizedtesting:*=2.8.1
 com.carrotsearch:hppc=0.9.1
 com.cybozu.labs:langdetect=1.1-20120112
 com.fasterxml.jackson:jackson-bom=2.13.3
 com.fasterxml.woodstox:woodstox-core=6.2.8
 com.github.ben-manes.caffeine:caffeine=3.1.1
-com.github.spotbugs:*=4.5.3
+com.github.spotbugs:*=4.7.2
 com.github.zafarkhaja:java-semver=0.9.0
 com.google.cloud:google-cloud-bom=0.178.0
-com.google.errorprone:*=2.11.0
+com.google.errorprone:*=2.15.0
 com.google.guava:guava=31.1-jre
 com.google.re2j:re2j=1.2
 com.jayway.jsonpath:json-path=2.4.0