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/03/07 16:36:38 UTC

[solr] branch branch_9x updated: SOLR-16074: Use PathUtils.deleteDirectory(path) to try to avoid commons-io IO-751 (#729)

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

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


The following commit(s) were added to refs/heads/branch_9x by this push:
     new 3c3fb1d  SOLR-16074: Use PathUtils.deleteDirectory(path) to try to avoid commons-io IO-751 (#729)
3c3fb1d is described below

commit 3c3fb1df82c5144c0d6b36b7c0fd3bc0343cf15b
Author: Kevin Risden <ri...@users.noreply.github.com>
AuthorDate: Mon Mar 7 11:35:22 2022 -0500

    SOLR-16074: Use PathUtils.deleteDirectory(path) to try to avoid commons-io IO-751 (#729)
    
    Co-authored-by: Mike Drob <md...@apache.org>
    Co-authored-by: Houston Putman <ho...@apache.org>
---
 .../forbidden-apis/commons-io.commons-io.all.txt   |  8 +++
 gradle/validation/forbidden-apis/defaults.all.txt  |  6 --
 solr/CHANGES.txt                                   |  2 +
 .../java/org/apache/solr/bench/BaseBenchState.java | 15 ++---
 .../src/java/org/apache/solr/cloud/CloudUtil.java  |  4 +-
 .../org/apache/solr/core/DirectoryFactory.java     |  9 +--
 .../src/java/org/apache/solr/core/SolrCore.java    | 12 ++--
 .../apache/solr/core/StandardDirectoryFactory.java |  6 +-
 .../repository/LocalFileSystemRepository.java      | 46 +++++----------
 .../designer/SchemaDesignerConfigSetHelper.java    |  4 +-
 .../src/java/org/apache/solr/util/SolrCLI.java     |  3 +-
 .../org/apache/solr/cloud/TestDistributedMap.java  |  4 +-
 .../analysis/TestManagedSynonymFilterFactory.java  | 14 ++---
 .../TestManagedSynonymGraphFilterFactory.java      |  3 +-
 .../test/org/apache/solr/util/AuthToolTest.java    |  3 +-
 .../solr/security/hadoop/KerberosTestServices.java |  4 +-
 .../org/apache/solr/ltr/TestLTROnSolrCloud.java    | 12 ++--
 .../test/org/apache/solr/ltr/TestRerankBase.java   | 68 +++++++++++-----------
 .../apache/solr/ltr/model/TestAdapterModel.java    | 12 ++--
 .../solr/ltr/model/TestDefaultWrapperModel.java    | 23 ++++----
 .../solr/ltr/store/rest/TestModelManager.java      |  2 +-
 .../store/rest/TestModelManagerPersistence.java    | 22 ++++---
 .../AbstractEmbeddedSolrServerTestCase.java        |  3 +-
 .../solr/common/cloud/TestZkMaintenanceUtils.java  |  4 +-
 .../java/org/apache/solr/SolrJettyTestBase.java    |  4 +-
 25 files changed, 143 insertions(+), 150 deletions(-)

diff --git a/gradle/validation/forbidden-apis/commons-io.commons-io.all.txt b/gradle/validation/forbidden-apis/commons-io.commons-io.all.txt
new file mode 100644
index 0000000..386c5cc
--- /dev/null
+++ b/gradle/validation/forbidden-apis/commons-io.commons-io.all.txt
@@ -0,0 +1,8 @@
+@defaultMessage Use InputStream.transferTo(OutputStream) or Reader.transferTo(Writer) instead
+org.apache.commons.io.IOUtils#copy(java.io.InputStream, java.io.OutputStream)
+org.apache.commons.io.IOUtils#copyLarge(java.io.InputStream, java.io.OutputStream)
+org.apache.commons.io.IOUtils#copy(java.io.Reader, java.io.Writer)
+org.apache.commons.io.IOUtils#copyLarge(java.io.Reader, java.io.Writer)
+
+@defaultMessage Use org.apache.commons.io.file.PathUtils#deleteDirectory(java.nio.file.Path) instead
+org.apache.commons.io.FileUtils#deleteDirectory(java.io.File)
diff --git a/gradle/validation/forbidden-apis/defaults.all.txt b/gradle/validation/forbidden-apis/defaults.all.txt
index e04c085..51643a0 100644
--- a/gradle/validation/forbidden-apis/defaults.all.txt
+++ b/gradle/validation/forbidden-apis/defaults.all.txt
@@ -91,9 +91,3 @@ java.lang.System#currentTimeMillis()
 
 @defaultMessage Use slf4j classes instead
 java.util.logging.**
-
-@defaultMessage Use InputStream.transferTo(OutputStream) or Reader.transferTo(Writer) instead
-org.apache.commons.io.IOUtils#copy(java.io.InputStream, java.io.OutputStream)
-org.apache.commons.io.IOUtils#copyLarge(java.io.InputStream, java.io.OutputStream)
-org.apache.commons.io.IOUtils#copy(java.io.Reader, java.io.Writer)
-org.apache.commons.io.IOUtils#copyLarge(java.io.Reader, java.io.Writer)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 819625a..2e4a4c5 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -603,6 +603,8 @@ and each individual module's jar will be included in its directory's lib/ folder
 
 * SOLR-16043: Fix HDFS tests - "Command processor" thread leak (Mike Drob, Kevin Risden)
 
+* SOLR-16074: Use PathUtils.deleteDirectory(path) to try to avoid commons-io IO-751 (Houston Putman, Mike Drob, Kevin Risden)
+
 Bug Fixes
 ---------------------
 * SOLR-15849: Fix the connection reset problem caused by the incorrect use of 4LW with \n when monitoring zooKeeper status (Fa Ming).
diff --git a/solr/benchmark/src/java/org/apache/solr/bench/BaseBenchState.java b/solr/benchmark/src/java/org/apache/solr/bench/BaseBenchState.java
index 8bf2baf..4db40c0 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/BaseBenchState.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/BaseBenchState.java
@@ -17,14 +17,15 @@
 package org.apache.solr.bench;
 
 import com.sun.management.HotSpotDiagnosticMXBean;
-import java.io.File;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.lang.management.ManagementFactory;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.SplittableRandom;
 import java.util.concurrent.atomic.AtomicBoolean;
 import javax.management.MBeanServer;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.bench.generators.SolrGen;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.openjdk.jmh.annotations.Level;
@@ -122,16 +123,16 @@ public class BaseBenchState {
 
       boolean dumpHeap = HEAP_DUMPED.compareAndExchange(false, true);
       if (dumpHeap) {
-        File file = new File(heapDump);
-        FileUtils.deleteDirectory(file);
-        file.mkdirs();
-        File dumpFile = new File(file, benchmarkParams.id() + ".hprof");
+        Path file = Path.of(heapDump);
+        PathUtils.deleteDirectory(file);
+        Files.createDirectories(file);
+        Path dumpFile = file.resolve(benchmarkParams.id() + ".hprof");
 
         MBeanServer server = ManagementFactory.getPlatformMBeanServer();
         HotSpotDiagnosticMXBean mxBean =
             ManagementFactory.newPlatformMXBeanProxy(
                 server, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);
-        mxBean.dumpHeap(dumpFile.getAbsolutePath(), true);
+        mxBean.dumpHeap(dumpFile.toAbsolutePath().toString(), true);
       }
     }
   }
diff --git a/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java b/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
index 7ee6ecc..8594213 100644
--- a/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
+++ b/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
@@ -29,7 +29,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
@@ -88,7 +88,7 @@ public class CloudUtil {
             }
 
             try {
-              FileUtils.deleteDirectory(desc.getInstanceDir().toFile());
+              PathUtils.deleteDirectory(desc.getInstanceDir());
             } catch (IOException e) {
               SolrException.log(
                   log,
diff --git a/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java b/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java
index a6959c5..e2a9df6 100644
--- a/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java
+++ b/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java
@@ -22,12 +22,13 @@ import java.io.FileFilter;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
+import java.nio.file.Files;
 import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FilterDirectory;
 import org.apache.lucene.store.FlushInfo;
@@ -394,9 +395,9 @@ public abstract class DirectoryFactory implements NamedListInitializedPlugin, Cl
   // Extension point to allow sub-classes to infuse additional code when deleting old index
   // directories
   protected boolean deleteOldIndexDirectory(String oldDirPath) throws IOException {
-    File dirToRm = new File(oldDirPath);
-    FileUtils.deleteDirectory(dirToRm);
-    return !dirToRm.isDirectory();
+    Path dirToRm = Path.of(oldDirPath);
+    PathUtils.deleteDirectory(dirToRm);
+    return !Files.isDirectory(dirToRm);
   }
 
   public void initCoreContainer(CoreContainer cc) {
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 ae93a502..11d08a3 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -64,7 +64,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.Consumer;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.lucene.codecs.Codec;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexDeletionPolicy;
@@ -3276,7 +3276,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
             public void postClose(SolrCore core) {
               if (desc != null) {
                 try {
-                  FileUtils.deleteDirectory(desc.getInstanceDir().toFile());
+                  PathUtils.deleteDirectory(desc.getInstanceDir());
                 } catch (IOException e) {
                   SolrException.log(
                       log,
@@ -3294,20 +3294,20 @@ public final class SolrCore implements SolrInfoBean, Closeable {
   public static void deleteUnloadedCore(
       CoreDescriptor cd, boolean deleteDataDir, boolean deleteInstanceDir) {
     if (deleteDataDir) {
-      File dataDir = cd.getInstanceDir().resolve(cd.getDataDir()).toFile();
+      Path dataDir = cd.getInstanceDir().resolve(cd.getDataDir());
       try {
-        FileUtils.deleteDirectory(dataDir);
+        PathUtils.deleteDirectory(dataDir);
       } catch (IOException e) {
         log.error(
             "Failed to delete data dir for unloaded core: {} dir: {}",
             cd.getName(),
-            dataDir.getAbsolutePath(),
+            dataDir.toAbsolutePath(),
             e);
       }
     }
     if (deleteInstanceDir) {
       try {
-        FileUtils.deleteDirectory(cd.getInstanceDir().toFile());
+        PathUtils.deleteDirectory(cd.getInstanceDir());
       } catch (IOException e) {
         log.error(
             "Failed to delete instance dir for unloaded core: {} dir: {}",
diff --git a/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java b/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java
index 353763e..09078b6 100644
--- a/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java
+++ b/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java
@@ -25,7 +25,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
 import java.util.Locale;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
 import org.apache.lucene.store.IOContext;
@@ -87,8 +87,8 @@ public class StandardDirectoryFactory extends CachingDirectoryFactory {
 
   @Override
   protected void removeDirectory(CacheValue cacheValue) throws IOException {
-    File dirFile = new File(cacheValue.path);
-    FileUtils.deleteDirectory(dirFile);
+    Path dirPath = Path.of(cacheValue.path);
+    PathUtils.deleteDirectory(dirPath);
   }
 
   /**
diff --git a/solr/core/src/java/org/apache/solr/core/backup/repository/LocalFileSystemRepository.java b/solr/core/src/java/org/apache/solr/core/backup/repository/LocalFileSystemRepository.java
index 2d48556..fac7d9e 100644
--- a/solr/core/src/java/org/apache/solr/core/backup/repository/LocalFileSystemRepository.java
+++ b/solr/core/src/java/org/apache/solr/core/backup/repository/LocalFileSystemRepository.java
@@ -22,16 +22,13 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
 import java.nio.file.LinkOption;
 import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
 import java.util.Collection;
 import java.util.Objects;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
 import org.apache.lucene.store.IOContext;
@@ -69,10 +66,10 @@ public class LocalFileSystemRepository implements BackupRepository {
     try {
       result = new URI(location);
       if (!result.isAbsolute()) {
-        result = Paths.get(location).toUri();
+        result = Path.of(location).toUri();
       }
     } catch (URISyntaxException ex) {
-      result = Paths.get(location).toUri();
+      result = Path.of(location).toUri();
     }
 
     return result;
@@ -82,7 +79,7 @@ public class LocalFileSystemRepository implements BackupRepository {
   public URI resolve(URI baseUri, String... pathComponents) {
     Preconditions.checkArgument(pathComponents.length > 0);
 
-    Path result = Paths.get(baseUri);
+    Path result = Path.of(baseUri);
     for (int i = 0; i < pathComponents.length; i++) {
       try {
         result = result.resolve(pathComponents[i]);
@@ -97,7 +94,7 @@ public class LocalFileSystemRepository implements BackupRepository {
 
   @Override
   public void createDirectory(URI path) throws IOException {
-    Path p = Paths.get(path);
+    Path p = Path.of(path);
     if (!Files.exists(p, LinkOption.NOFOLLOW_LINKS)) {
       Files.createDirectory(p);
     }
@@ -105,39 +102,24 @@ public class LocalFileSystemRepository implements BackupRepository {
 
   @Override
   public void deleteDirectory(URI path) throws IOException {
-    Files.walkFileTree(
-        Paths.get(path),
-        new SimpleFileVisitor<Path>() {
-          @Override
-          public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
-              throws IOException {
-            Files.delete(file);
-            return FileVisitResult.CONTINUE;
-          }
-
-          @Override
-          public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
-            Files.delete(dir);
-            return FileVisitResult.CONTINUE;
-          }
-        });
+    PathUtils.deleteDirectory(Path.of(path));
   }
 
   @Override
   public boolean exists(URI path) throws IOException {
-    return Files.exists(Paths.get(path));
+    return Files.exists(Path.of(path));
   }
 
   @Override
   public IndexInput openInput(URI dirPath, String fileName, IOContext ctx) throws IOException {
-    try (FSDirectory dir = new NIOFSDirectory(Paths.get(dirPath), NoLockFactory.INSTANCE)) {
+    try (FSDirectory dir = new NIOFSDirectory(Path.of(dirPath), NoLockFactory.INSTANCE)) {
       return dir.openInput(fileName, ctx);
     }
   }
 
   @Override
   public OutputStream createOutput(URI path) throws IOException {
-    return Files.newOutputStream(Paths.get(path));
+    return Files.newOutputStream(Path.of(path));
   }
 
   @Override
@@ -148,21 +130,21 @@ public class LocalFileSystemRepository implements BackupRepository {
       return new String[0];
     }
 
-    try (FSDirectory dir = new NIOFSDirectory(Paths.get(dirPath), NoLockFactory.INSTANCE)) {
+    try (FSDirectory dir = new NIOFSDirectory(Path.of(dirPath), NoLockFactory.INSTANCE)) {
       return dir.listAll();
     }
   }
 
   @Override
   public PathType getPathType(URI path) throws IOException {
-    return Files.isDirectory(Paths.get(path)) ? PathType.DIRECTORY : PathType.FILE;
+    return Files.isDirectory(Path.of(path)) ? PathType.DIRECTORY : PathType.FILE;
   }
 
   @Override
   public void copyIndexFileFrom(
       Directory sourceDir, String sourceFileName, URI destDir, String destFileName)
       throws IOException {
-    try (FSDirectory dir = new NIOFSDirectory(Paths.get(destDir), NoLockFactory.INSTANCE)) {
+    try (FSDirectory dir = new NIOFSDirectory(Path.of(destDir), NoLockFactory.INSTANCE)) {
       copyIndexFileFrom(sourceDir, sourceFileName, dir, destFileName);
     }
   }
@@ -171,7 +153,7 @@ public class LocalFileSystemRepository implements BackupRepository {
   public void copyIndexFileTo(
       URI sourceDir, String sourceFileName, Directory dest, String destFileName)
       throws IOException {
-    try (FSDirectory dir = new NIOFSDirectory(Paths.get(sourceDir), NoLockFactory.INSTANCE)) {
+    try (FSDirectory dir = new NIOFSDirectory(Path.of(sourceDir), NoLockFactory.INSTANCE)) {
       dest.copyFrom(dir, sourceFileName, destFileName, DirectoryFactory.IOCONTEXT_NO_CACHE);
     }
   }
@@ -181,7 +163,7 @@ public class LocalFileSystemRepository implements BackupRepository {
       throws IOException {
     if (files.isEmpty()) return;
 
-    try (FSDirectory dir = new NIOFSDirectory(Paths.get(path), NoLockFactory.INSTANCE)) {
+    try (FSDirectory dir = new NIOFSDirectory(Path.of(path), NoLockFactory.INSTANCE)) {
       for (String file : files) {
         try {
           dir.deleteFile(file);
diff --git a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
index 34505c3..3adaf09 100644
--- a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
+++ b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
@@ -57,8 +57,8 @@ import java.util.concurrent.TimeoutException;
 import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
-import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
 import org.apache.http.client.methods.HttpGet;
@@ -1211,7 +1211,7 @@ class SchemaDesignerConfigSetHelper implements SchemaDesignerConstants {
             });
       }
     } finally {
-      FileUtils.deleteDirectory(tmpDirectory.toFile());
+      PathUtils.deleteDirectory(tmpDirectory);
     }
     return baos.toByteArray();
   }
diff --git a/solr/core/src/java/org/apache/solr/util/SolrCLI.java b/solr/core/src/java/org/apache/solr/util/SolrCLI.java
index 79f6e0c..9448d66 100755
--- a/solr/core/src/java/org/apache/solr/util/SolrCLI.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrCLI.java
@@ -72,6 +72,7 @@ import org.apache.commons.exec.Executor;
 import org.apache.commons.exec.OS;
 import org.apache.commons.exec.environment.EnvironmentUtils;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.SystemUtils;
 import org.apache.http.HttpEntity;
@@ -1830,7 +1831,7 @@ public class SolrCLI implements CLIO {
         }
       } catch (Exception e) {
         /* create-core failed, cleanup the copied configset before propagating the error. */
-        FileUtils.deleteDirectory(coreInstanceDir);
+        PathUtils.deleteDirectory(coreInstanceDir.toPath());
         throw e;
       }
     }
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestDistributedMap.java b/solr/core/src/test/org/apache/solr/cloud/TestDistributedMap.java
index f1e3669..088250c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestDistributedMap.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestDistributedMap.java
@@ -20,7 +20,7 @@ import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.file.Path;
 import java.util.Locale;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.zookeeper.CreateMode;
@@ -49,7 +49,7 @@ public class TestDistributedMap extends SolrTestCaseJ4 {
       zkServer = null;
     }
     if (null != zkDir) {
-      FileUtils.deleteDirectory(zkDir.toFile());
+      PathUtils.deleteDirectory(zkDir);
       zkDir = null;
     }
   }
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/analysis/TestManagedSynonymFilterFactory.java b/solr/core/src/test/org/apache/solr/rest/schema/analysis/TestManagedSynonymFilterFactory.java
index cb03c7a..a837497 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/analysis/TestManagedSynonymFilterFactory.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/analysis/TestManagedSynonymFilterFactory.java
@@ -18,8 +18,8 @@ package org.apache.solr.rest.schema.analysis;
 
 import static org.apache.solr.common.util.Utils.toJSONString;
 
-import java.io.File;
 import java.net.URLEncoder;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -27,7 +27,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.util.RestTestBase;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.junit.After;
@@ -36,20 +36,20 @@ import org.junit.Test;
 
 public class TestManagedSynonymFilterFactory extends RestTestBase {
 
-  private static File tmpSolrHome;
+  private static Path tmpSolrHome;
 
   /** Setup to make the schema mutable */
   @Before
   public void before() throws Exception {
-    tmpSolrHome = createTempDir().toFile();
-    FileUtils.copyDirectory(new File(TEST_HOME()), tmpSolrHome.getAbsoluteFile());
+    tmpSolrHome = createTempDir();
+    PathUtils.copyDirectory(TEST_PATH(), tmpSolrHome.toAbsolutePath());
 
     final SortedMap<ServletHolder, String> extraServlets = new TreeMap<>();
 
     System.setProperty("managed.schema.mutable", "true");
     System.setProperty("enable.update.log", "false");
     createJettyAndHarness(
-        tmpSolrHome.getAbsolutePath(),
+        tmpSolrHome.toAbsolutePath().toString(),
         "solrconfig-managed-schema.xml",
         "schema-rest.xml",
         "/solr",
@@ -64,7 +64,7 @@ public class TestManagedSynonymFilterFactory extends RestTestBase {
       jetty = null;
     }
     if (null != tmpSolrHome) {
-      FileUtils.deleteDirectory(tmpSolrHome);
+      PathUtils.deleteDirectory(tmpSolrHome);
       tmpSolrHome = null;
     }
     System.clearProperty("managed.schema.mutable");
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/analysis/TestManagedSynonymGraphFilterFactory.java b/solr/core/src/test/org/apache/solr/rest/schema/analysis/TestManagedSynonymGraphFilterFactory.java
index 9d902bb..dc2c23b 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/analysis/TestManagedSynonymGraphFilterFactory.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/analysis/TestManagedSynonymGraphFilterFactory.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.util.RestTestBase;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.junit.After;
@@ -67,7 +68,7 @@ public class TestManagedSynonymGraphFilterFactory extends RestTestBase {
       jetty = null;
     }
     if (null != tmpSolrHome) {
-      FileUtils.deleteDirectory(tmpSolrHome);
+      PathUtils.deleteDirectory(tmpSolrHome.toPath());
     }
     System.clearProperty("managed.schema.mutable");
     System.clearProperty("enable.update.log");
diff --git a/solr/core/src/test/org/apache/solr/util/AuthToolTest.java b/solr/core/src/test/org/apache/solr/util/AuthToolTest.java
index 5bec00d..1f00461 100644
--- a/solr/core/src/test/org/apache/solr/util/AuthToolTest.java
+++ b/solr/core/src/test/org/apache/solr/util/AuthToolTest.java
@@ -23,6 +23,7 @@ import static org.apache.solr.util.SolrCLI.parseCmdLine;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import org.apache.commons.cli.CommandLine;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.junit.After;
 import org.junit.Before;
@@ -51,7 +52,7 @@ public class AuthToolTest extends SolrCloudTestCase {
   public void tearDown() throws Exception {
     super.tearDown();
     if (null != dir) {
-      org.apache.commons.io.FileUtils.deleteDirectory(dir.toFile());
+      PathUtils.deleteDirectory(dir);
       dir = null;
     }
   }
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/KerberosTestServices.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/KerberosTestServices.java
index 3208ed2..a25132e 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/KerberosTestServices.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/KerberosTestServices.java
@@ -28,7 +28,7 @@ import java.util.Objects;
 import java.util.Properties;
 import javax.security.auth.login.AppConfigurationEntry;
 import javax.security.auth.login.Configuration;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.hadoop.minikdc.MiniKdc;
 import org.apache.solr.client.solrj.impl.Krb5HttpClientBuilder;
 import org.slf4j.Logger;
@@ -74,7 +74,7 @@ public class KerberosTestServices {
         kdc = getKdc(workDir, debug);
         kdc.start();
       } catch (BindException e) {
-        FileUtils.deleteDirectory(workDir); // clean directory
+        PathUtils.deleteDirectory(workDir.toPath()); // clean directory
         numTries++;
         if (numTries == 3) {
           log.error("Failed setting up MiniKDC. Tried {} times.", numTries);
diff --git a/solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTROnSolrCloud.java b/solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTROnSolrCloud.java
index d64cba9..e38e489 100644
--- a/solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTROnSolrCloud.java
+++ b/solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTROnSolrCloud.java
@@ -18,11 +18,11 @@ package org.apache.solr.ltr;
 import static java.util.stream.Collectors.toList;
 
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
-import java.io.File;
+import java.nio.file.Path;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.IntStream;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.embedded.JettyConfig;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -326,9 +326,9 @@ public class TestLTROnSolrCloud extends TestRerankBase {
   private void setupSolrCluster(int numShards, int numReplicas, int numServers) throws Exception {
     JettyConfig jc = buildJettyConfig("/solr");
     jc = JettyConfig.builder(jc).build();
-    solrCluster = new MiniSolrCloudCluster(numServers, tmpSolrHome.toPath(), jc);
-    File configDir = tmpSolrHome.toPath().resolve("collection1/conf").toFile();
-    solrCluster.uploadConfigSet(configDir.toPath(), "conf1");
+    solrCluster = new MiniSolrCloudCluster(numServers, tmpSolrHome, jc);
+    Path configDir = tmpSolrHome.resolve("collection1/conf");
+    solrCluster.uploadConfigSet(configDir, "conf1");
 
     solrCluster.getSolrClient().setDefaultCollection(COLLECTION);
 
@@ -475,7 +475,7 @@ public class TestLTROnSolrCloud extends TestRerankBase {
   @AfterClass
   public static void after() throws Exception {
     if (null != tmpSolrHome) {
-      FileUtils.deleteDirectory(tmpSolrHome);
+      PathUtils.deleteDirectory(tmpSolrHome);
       tmpSolrHome = null;
     }
     System.clearProperty("managed.schema.mutable");
diff --git a/solr/modules/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java b/solr/modules/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java
index 4f96ef6..3089263 100644
--- a/solr/modules/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java
+++ b/solr/modules/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java
@@ -16,19 +16,19 @@
  */
 package org.apache.solr.ltr;
 
-import java.io.File;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
-import java.nio.file.Paths;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrResourceLoader;
@@ -49,10 +49,10 @@ public class TestRerankBase extends RestTestBase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   protected static final SolrResourceLoader solrResourceLoader =
-      new SolrResourceLoader(Paths.get("").toAbsolutePath());
+      new SolrResourceLoader(Path.of("").toAbsolutePath());
 
-  protected static File tmpSolrHome;
-  protected static File tmpConfDir;
+  protected static Path tmpSolrHome;
+  protected static Path tmpConfDir;
 
   public static final String FEATURE_FILE_NAME = "_schema_feature-store.json";
   public static final String MODEL_FILE_NAME = "_schema_model-store.json";
@@ -61,8 +61,8 @@ public class TestRerankBase extends RestTestBase {
   protected static final String COLLECTION = "collection1";
   protected static final String CONF_DIR = COLLECTION + "/conf";
 
-  protected static File fstorefile = null;
-  protected static File mstorefile = null;
+  protected static Path fstorefile = null;
+  protected static Path mstorefile = null;
 
   private static final String SYSTEM_PROPERTY_SOLR_LTR_TRANSFORMER_FV_DEFAULTFORMAT =
       "solr.ltr.transformer.fv.defaultFormat";
@@ -134,40 +134,40 @@ public class TestRerankBase extends RestTestBase {
 
   protected static void setupTestInit(String solrconfig, String schema, boolean isPersistent)
       throws Exception {
-    tmpSolrHome = createTempDir().toFile();
-    tmpConfDir = new File(tmpSolrHome, CONF_DIR);
-    tmpConfDir.deleteOnExit();
-    FileUtils.copyDirectory(new File(TEST_HOME()), tmpSolrHome.getAbsoluteFile());
+    tmpSolrHome = createTempDir();
+    tmpConfDir = tmpSolrHome.resolve(CONF_DIR);
+    tmpConfDir.toFile().deleteOnExit();
+    PathUtils.copyDirectory(TEST_PATH(), tmpSolrHome.toAbsolutePath());
 
-    final File fstore = new File(tmpConfDir, FEATURE_FILE_NAME);
-    final File mstore = new File(tmpConfDir, MODEL_FILE_NAME);
+    final Path fstore = tmpConfDir.resolve(FEATURE_FILE_NAME);
+    final Path mstore = tmpConfDir.resolve(MODEL_FILE_NAME);
 
     if (isPersistent) {
       fstorefile = fstore;
       mstorefile = mstore;
     }
 
-    if (fstore.exists()) {
+    if (Files.exists(fstore)) {
       if (log.isInfoEnabled()) {
-        log.info("remove feature store config file in {}", fstore.getAbsolutePath());
+        log.info("remove feature store config file in {}", fstore.toAbsolutePath());
       }
-      Files.delete(fstore.toPath());
+      Files.delete(fstore);
     }
-    if (mstore.exists()) {
+    if (Files.exists(mstore)) {
       if (log.isInfoEnabled()) {
-        log.info("remove model store config file in {}", mstore.getAbsolutePath());
+        log.info("remove model store config file in {}", mstore.toAbsolutePath());
       }
-      Files.delete(mstore.toPath());
+      Files.delete(mstore);
     }
     if (!solrconfig.equals("solrconfig.xml")) {
-      FileUtils.copyFile(
-          new File(tmpSolrHome.getAbsolutePath() + "/collection1/conf/" + solrconfig),
-          new File(tmpSolrHome.getAbsolutePath() + "/collection1/conf/solrconfig.xml"));
+      Files.copy(
+          tmpSolrHome.resolve(CONF_DIR).resolve(solrconfig),
+          tmpSolrHome.resolve(CONF_DIR).resolve("solrconfig.xml"));
     }
     if (!schema.equals("schema.xml")) {
-      FileUtils.copyFile(
-          new File(tmpSolrHome.getAbsolutePath() + "/collection1/conf/" + schema),
-          new File(tmpSolrHome.getAbsolutePath() + "/collection1/conf/schema.xml"));
+      Files.copy(
+          tmpSolrHome.resolve(CONF_DIR).resolve(schema),
+          tmpSolrHome.resolve(CONF_DIR).resolve("schema.xml"));
     }
 
     System.setProperty("managed.schema.mutable", "true");
@@ -178,14 +178,16 @@ public class TestRerankBase extends RestTestBase {
     setupTestInit(solrconfig, schema, false);
     System.setProperty("enable.update.log", "false");
 
-    createJettyAndHarness(tmpSolrHome.getAbsolutePath(), solrconfig, schema, "/solr", true, null);
+    createJettyAndHarness(
+        tmpSolrHome.toAbsolutePath().toString(), solrconfig, schema, "/solr", true, null);
   }
 
   public static void setupPersistentTest(String solrconfig, String schema) throws Exception {
 
     setupTestInit(solrconfig, schema, true);
 
-    createJettyAndHarness(tmpSolrHome.getAbsolutePath(), solrconfig, schema, "/solr", true, null);
+    createJettyAndHarness(
+        tmpSolrHome.toAbsolutePath().toString(), solrconfig, schema, "/solr", true, null);
   }
 
   protected static void aftertest() throws Exception {
@@ -198,7 +200,7 @@ public class TestRerankBase extends RestTestBase {
       jetty = null;
     }
     if (null != tmpSolrHome) {
-      FileUtils.deleteDirectory(tmpSolrHome);
+      PathUtils.deleteDirectory(tmpSolrHome);
       tmpSolrHome = null;
     }
     System.clearProperty("managed.schema.mutable");
@@ -292,7 +294,7 @@ public class TestRerankBase extends RestTestBase {
 
   public static void loadModels(String fileName) throws Exception {
     final URL url = TestRerankBase.class.getResource("/modelExamples/" + fileName);
-    final String multipleModels = FileUtils.readFileToString(new File(url.toURI()), "UTF-8");
+    final String multipleModels = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8);
 
     assertJPut(ManagedModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0");
   }
@@ -307,11 +309,11 @@ public class TestRerankBase extends RestTestBase {
       String modelFileName, String featureFileName, String featureStoreName)
       throws ModelException, Exception {
     URL url = TestRerankBase.class.getResource("/modelExamples/" + modelFileName);
-    final String modelJson = FileUtils.readFileToString(new File(url.toURI()), "UTF-8");
+    final String modelJson = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8);
     final ManagedModelStore ms = getManagedModelStore();
 
     url = TestRerankBase.class.getResource("/featureExamples/" + featureFileName);
-    final String featureJson = FileUtils.readFileToString(new File(url.toURI()), "UTF-8");
+    final String featureJson = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8);
 
     Object parsedFeatureJson = null;
     try {
@@ -349,7 +351,7 @@ public class TestRerankBase extends RestTestBase {
 
   public static void loadFeatures(String fileName) throws Exception {
     final URL url = TestRerankBase.class.getResource("/featureExamples/" + fileName);
-    final String multipleFeatures = FileUtils.readFileToString(new File(url.toURI()), "UTF-8");
+    final String multipleFeatures = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8);
     log.info("send \n{}", multipleFeatures);
 
     assertJPut(ManagedFeatureStore.REST_END_POINT, multipleFeatures, "/responseHeader/status==0");
diff --git a/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestAdapterModel.java b/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestAdapterModel.java
index 37426c1..bc992cf 100644
--- a/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestAdapterModel.java
+++ b/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestAdapterModel.java
@@ -19,13 +19,13 @@ package org.apache.solr.ltr.model;
 
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.List;
 import java.util.Map;
 import org.apache.lucene.index.LeafReaderContext;
@@ -62,13 +62,13 @@ public class TestAdapterModel extends TestRerankBase {
         "popularity", FieldValueFeature.class.getName(), "test", "{\"field\":\"popularity\"}");
 
     scoreValue = random().nextFloat();
-    final File scoreValueFile = new File(tmpConfDir, "scoreValue.txt");
+    final Path scoreValueFile = tmpConfDir.resolve("scoreValue.txt");
     try (BufferedWriter writer =
         new BufferedWriter(
-            new OutputStreamWriter(new FileOutputStream(scoreValueFile), StandardCharsets.UTF_8))) {
+            new OutputStreamWriter(
+                Files.newOutputStream(scoreValueFile), StandardCharsets.UTF_8))) {
       writer.write(Float.toString(scoreValue));
     }
-    scoreValueFile.deleteOnExit();
 
     final String modelJson =
         getModelInJson(
@@ -76,7 +76,7 @@ public class TestAdapterModel extends TestRerankBase {
             CustomModel.class.getName(),
             new String[] {"popularity"},
             "test",
-            "{\"answerFileName\":\"" + scoreValueFile.getName() + "\"}");
+            "{\"answerFileName\":\"" + scoreValueFile.getFileName().toString() + "\"}");
     assertJPut(ManagedModelStore.REST_END_POINT, modelJson, "/responseHeader/status==0");
   }
 
diff --git a/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestDefaultWrapperModel.java b/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestDefaultWrapperModel.java
index 4ded7d4..2fbad29 100644
--- a/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestDefaultWrapperModel.java
+++ b/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestDefaultWrapperModel.java
@@ -18,10 +18,10 @@
 package org.apache.solr.ltr.model;
 
 import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.OutputStreamWriter;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -37,7 +37,7 @@ import org.junit.Test;
 public class TestDefaultWrapperModel extends TestRerankBase {
 
   private static final String featureStoreName = "test";
-  private static File baseModelFile = null;
+  private static Path baseModelFile = null;
 
   static List<Feature> features = null;
 
@@ -66,13 +66,12 @@ public class TestDefaultWrapperModel extends TestRerankBase {
             featureStoreName,
             "{\"weights\":{\"popularity\":-1.0, \"const\":1.0}}");
     // prepare the base model as a file resource
-    baseModelFile = new File(tmpConfDir, "baseModel.json");
+    baseModelFile = tmpConfDir.resolve("baseModel.json");
     try (BufferedWriter writer =
         new BufferedWriter(
-            new OutputStreamWriter(new FileOutputStream(baseModelFile), StandardCharsets.UTF_8))) {
+            new OutputStreamWriter(Files.newOutputStream(baseModelFile), StandardCharsets.UTF_8))) {
       writer.write(baseModelJson);
     }
-    baseModelFile.deleteOnExit();
   }
 
   @After
@@ -92,7 +91,9 @@ public class TestDefaultWrapperModel extends TestRerankBase {
   public void testLoadModelFromResource() throws Exception {
     String wrapperModelJson =
         getDefaultWrapperModelInJson(
-            "fileWrapper", new String[0], "{\"resource\":\"" + baseModelFile.getName() + "\"}");
+            "fileWrapper",
+            new String[0],
+            "{\"resource\":\"" + baseModelFile.getFileName().toString() + "\"}");
     assertJPut(ManagedModelStore.REST_END_POINT, wrapperModelJson, "/responseHeader/status==0");
 
     final SolrQuery query = new SolrQuery();
@@ -116,12 +117,12 @@ public class TestDefaultWrapperModel extends TestRerankBase {
         getDefaultWrapperModelInJson(
             "otherNestedWrapper",
             new String[0],
-            "{\"resource\":\"" + baseModelFile.getName() + "\"}");
-    File otherWrapperModelFile = new File(tmpConfDir, "nestedWrapperModel.json");
+            "{\"resource\":\"" + baseModelFile.getFileName().toString() + "\"}");
+    Path otherWrapperModelFile = tmpConfDir.resolve("nestedWrapperModel.json");
     try (BufferedWriter writer =
         new BufferedWriter(
             new OutputStreamWriter(
-                new FileOutputStream(otherWrapperModelFile), StandardCharsets.UTF_8))) {
+                Files.newOutputStream(otherWrapperModelFile), StandardCharsets.UTF_8))) {
       writer.write(otherWrapperModelJson);
     }
 
@@ -129,7 +130,7 @@ public class TestDefaultWrapperModel extends TestRerankBase {
         getDefaultWrapperModelInJson(
             "nestedWrapper",
             new String[0],
-            "{\"resource\":\"" + otherWrapperModelFile.getName() + "\"}");
+            "{\"resource\":\"" + otherWrapperModelFile.getFileName().toString() + "\"}");
     assertJPut(ManagedModelStore.REST_END_POINT, wrapperModelJson, "/responseHeader/status==0");
     final SolrQuery query = new SolrQuery();
     query.setQuery("{!func}pow(popularity,2)");
diff --git a/solr/modules/ltr/src/test/org/apache/solr/ltr/store/rest/TestModelManager.java b/solr/modules/ltr/src/test/org/apache/solr/ltr/store/rest/TestModelManager.java
index cda8dbd..96eeda9 100644
--- a/solr/modules/ltr/src/test/org/apache/solr/ltr/store/rest/TestModelManager.java
+++ b/solr/modules/ltr/src/test/org/apache/solr/ltr/store/rest/TestModelManager.java
@@ -39,7 +39,7 @@ public class TestModelManager extends TestRerankBase {
 
   @Test
   public void test() throws Exception {
-    final SolrResourceLoader loader = new SolrResourceLoader(tmpSolrHome.toPath());
+    final SolrResourceLoader loader = new SolrResourceLoader(tmpSolrHome);
 
     final RestManager.Registry registry = loader.getManagedResourceRegistry();
     assertNotNull(
diff --git a/solr/modules/ltr/src/test/org/apache/solr/ltr/store/rest/TestModelManagerPersistence.java b/solr/modules/ltr/src/test/org/apache/solr/ltr/store/rest/TestModelManagerPersistence.java
index 7e42837..3b8f076 100644
--- a/solr/modules/ltr/src/test/org/apache/solr/ltr/store/rest/TestModelManagerPersistence.java
+++ b/solr/modules/ltr/src/test/org/apache/solr/ltr/store/rest/TestModelManagerPersistence.java
@@ -17,14 +17,13 @@
 package org.apache.solr.ltr.store.rest;
 
 import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.OutputStreamWriter;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.io.FileUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.ltr.TestRerankBase;
 import org.apache.solr.ltr.feature.Feature;
@@ -82,8 +81,8 @@ public class TestModelManagerPersistence extends TestRerankBase {
         new String[] {"feature1"},
         "test1",
         "{\"weights\":{\"feature1\":1.0}}");
-    final String fstorecontent = FileUtils.readFileToString(fstorefile, "UTF-8");
-    final String mstorecontent = FileUtils.readFileToString(mstorefile, "UTF-8");
+    final String fstorecontent = Files.readString(fstorefile, StandardCharsets.UTF_8);
+    final String mstorecontent = Files.readString(mstorefile, StandardCharsets.UTF_8);
 
     // check feature/model stores on deletion
     @SuppressWarnings({"unchecked"})
@@ -230,13 +229,12 @@ public class TestModelManagerPersistence extends TestRerankBase {
             new String[] {"popularity", "const"},
             FS_NAME,
             "{\"weights\":{\"popularity\":-1.0, \"const\":1.0}}");
-    File baseModelFile = new File(tmpConfDir, "baseModelForPersistence.json");
+    Path baseModelFile = tmpConfDir.resolve("baseModelForPersistence.json");
     try (BufferedWriter writer =
         new BufferedWriter(
-            new OutputStreamWriter(new FileOutputStream(baseModelFile), StandardCharsets.UTF_8))) {
+            new OutputStreamWriter(Files.newOutputStream(baseModelFile), StandardCharsets.UTF_8))) {
       writer.write(baseModelJson);
     }
-    baseModelFile.deleteOnExit();
 
     // setup wrapper model
     String wrapperModelJson =
@@ -245,18 +243,18 @@ public class TestModelManagerPersistence extends TestRerankBase {
             DefaultWrapperModel.class.getName(),
             new String[0],
             FS_NAME,
-            "{\"resource\":\"" + baseModelFile.getName() + "\"}");
+            "{\"resource\":\"" + baseModelFile.getFileName() + "\"}");
     assertJPut(ManagedModelStore.REST_END_POINT, wrapperModelJson, "/responseHeader/status==0");
-    doWrapperModelPersistenceChecks(modelName, FS_NAME, baseModelFile.getName());
+    doWrapperModelPersistenceChecks(modelName, FS_NAME, baseModelFile.getFileName().toString());
 
     // check persistence after reload
     restTestHarness.reload();
-    doWrapperModelPersistenceChecks(modelName, FS_NAME, baseModelFile.getName());
+    doWrapperModelPersistenceChecks(modelName, FS_NAME, baseModelFile.getFileName().toString());
 
     // check persistence after restart
     jetty.stop();
     jetty.start();
-    doWrapperModelPersistenceChecks(modelName, FS_NAME, baseModelFile.getName());
+    doWrapperModelPersistenceChecks(modelName, FS_NAME, baseModelFile.getFileName().toString());
 
     // delete test settings
     restTestHarness.delete(ManagedModelStore.REST_END_POINT + "/" + modelName);
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/AbstractEmbeddedSolrServerTestCase.java b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/AbstractEmbeddedSolrServerTestCase.java
index 439d85d..7a46507 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/AbstractEmbeddedSolrServerTestCase.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/AbstractEmbeddedSolrServerTestCase.java
@@ -19,6 +19,7 @@ package org.apache.solr.client.solrj.embedded;
 import java.io.File;
 import java.nio.file.Path;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.core.CoreContainer;
@@ -86,7 +87,7 @@ public abstract class AbstractEmbeddedSolrServerTestCase extends SolrTestCaseJ4
   @AfterClass
   public static void tearDownHome() throws Exception {
     if (SOLR_HOME != null) {
-      FileUtils.deleteDirectory(SOLR_HOME.toFile());
+      PathUtils.deleteDirectory(SOLR_HOME);
     }
   }
 
diff --git a/solr/solrj/src/test/org/apache/solr/common/cloud/TestZkMaintenanceUtils.java b/solr/solrj/src/test/org/apache/solr/common/cloud/TestZkMaintenanceUtils.java
index 4b6d79d..b2c92e8 100644
--- a/solr/solrj/src/test/org/apache/solr/common/cloud/TestZkMaintenanceUtils.java
+++ b/solr/solrj/src/test/org/apache/solr/common/cloud/TestZkMaintenanceUtils.java
@@ -25,7 +25,7 @@ import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.cloud.ZkTestServer;
@@ -55,7 +55,7 @@ public class TestZkMaintenanceUtils extends SolrTestCaseJ4 {
       zkServer = null;
     }
     if (null != zkDir) {
-      FileUtils.deleteDirectory(zkDir.toFile());
+      PathUtils.deleteDirectory(zkDir);
       zkDir = null;
     }
   }
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java b/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
index b9d6c89..d96f697 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
@@ -27,7 +27,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Properties;
 import java.util.SortedMap;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettyConfig;
@@ -174,7 +174,7 @@ public abstract class SolrJettyTestBase extends SolrTestCaseJ4 {
 
   public static void cleanUpJettyHome(File solrHome) throws Exception {
     if (solrHome.exists()) {
-      FileUtils.deleteDirectory(solrHome);
+      PathUtils.deleteDirectory(solrHome.toPath());
     }
   }