docs: private void locateCodebasesRequiredForAnalysis(IClassPath classPath, IClassPathBuilderProgress progress)
              throws InterruptedException, IOException, ResourceNotFoundException {
          boolean foundJavaLangObject = false;
          boolean foundFindBugsAnnotations = false;
          boolean foundJSR305Annotations = false;
  
          for (DiscoveredCodeBase discoveredCodeBase : discoveredCodeBaseList) {
              if (!foundJavaLangObject) {
                  foundJavaLangObject = probeCodeBaseForResource(discoveredCodeBase, "java/lang/Object.class");
              }
              if (!foundFindBugsAnnotations) {
                  foundFindBugsAnnotations = probeCodeBaseForResource(discoveredCodeBase,
                          "edu/umd/cs/findbugs/annotations/Nonnull.class");
              }
              if (!foundJSR305Annotations) {
                  foundJSR305Annotations = probeCodeBaseForResource(discoveredCodeBase, "javax/annotation/meta/TypeQualifier.class");
                  if (DEBUG) {
                      System.out.println("foundJSR305Annotations: " + foundJSR305Annotations);
                  }
              }
          }
  
          if (!foundJavaLangObject) {
              processWorkList(classPath, buildSystemCodebaseList(), progress);
          }
  
          // If we're running findbugs-full.jar, IT contains the contents
          // of jsr305.jar and annotations.jar. So, add it to the classpath.
          if (runningFindBugsFullJar()) {
              processWorkList(classPath, buildFindBugsFullJarCodebaseList(), progress);
              return;
          }
  
          // Not running findbugs-full.jar: try to find jsr305.jar and
          // annotations.jar.
  
          if (!foundFindBugsAnnotations) {
              processWorkList(classPath, buildFindBugsAnnotationCodebaseList(), progress);
          }
          if (!foundJSR305Annotations) {
              processWorkList(classPath, buildJSR305AnnotationsCodebaseList(), progress);
          }
      }