docs: public static void findClasspathOrder(final ClassLoader classLoader, final ClasspathOrder classpathOrder,
              final ScanSpec scanSpec, final LogNode log) {
          // type StandardRoot (implements WebResourceRoot)
          final Object resources = ReflectionUtils.invokeMethod(classLoader, "getResources", false);
          // type List<URL>
          final Object baseURLs = ReflectionUtils.invokeMethod(resources, "getBaseUrls", false);
          classpathOrder.addClasspathEntryObject(baseURLs, classLoader, scanSpec, log);
          // type List<List<WebResourceSet>>
          // members: preResources, mainResources, classResources, jarResources, postResources
          @SuppressWarnings("unchecked")
          final List<List<?>> allResources = (List<List<?>>) ReflectionUtils.getFieldVal(resources, "allResources",
                  false);
          if (allResources != null) {
              // type List<WebResourceSet> 
              for (final List<?> webResourceSetList : allResources) {
                  // type WebResourceSet
                  // {DirResourceSet, FileResourceSet, JarResourceSet, JarWarResourceSet, EmptyResourceSet}
                  for (final Object webResourceSet : webResourceSetList) {
                      // For DirResourceSet
                      final File file = (File) ReflectionUtils.invokeMethod(webResourceSet, "getFileBase", false);
                      String base = file == null ? null : file.getPath();
                      if (base == null) {
                          // For FileResourceSet
                          base = (String) ReflectionUtils.invokeMethod(webResourceSet, "getBase", false);
                      }
                      if (base == null) {
                          // For JarResourceSet and JarWarResourceSet
                          // The absolute path to the WAR file on the file system in which the JAR is located
                          base = (String) ReflectionUtils.invokeMethod(webResourceSet, "getBaseUrlString", false);
                      }
                      if (base != null) {
                          // For JarWarResourceSet: the path within the WAR file where the JAR file is located
                          final String archivePath = (String) ReflectionUtils.getFieldVal(webResourceSet,
                                  "archivePath", false);
                          if (archivePath != null && !archivePath.isEmpty()) {
                              // If archivePath is non-null, this is a jar within a war
                              base += "!" + (archivePath.startsWith("/") ? archivePath : "/" + archivePath);
                          }
                          final String className = webResourceSet.getClass().getName();
                          final boolean isJar = className
                                  .equals("java.org.apache.catalina.webresources.JarResourceSet")
                                  || className.equals("java.org.apache.catalina.webresources.JarWarResourceSet");
                          // The path within this WebResourceSet where resources will be served from,
                          // e.g. for a resource JAR, this would be "META-INF/resources"
                          final String internalPath = (String) ReflectionUtils.invokeMethod(webResourceSet,
                                  "getInternalPath", false);
                          if (internalPath != null && !internalPath.isEmpty() && !internalPath.equals("/")) {
                              classpathOrder.addClasspathEntryObject(
                                      base + (isJar ? "!" : "")
                                              + (internalPath.startsWith("/") ? internalPath : "/" + internalPath),
                                      classLoader, scanSpec, log);
                          } else {
                              classpathOrder.addClasspathEntryObject(base, classLoader, scanSpec, log);
                          }
                      }
                  }
              }
          }
          // This may or may not duplicate the above
          final Object urls = ReflectionUtils.invokeMethod(classLoader, "getURLs", false);
          classpathOrder.addClasspathEntryObject(urls, classLoader, scanSpec, log);
      }