docs: public static void main(String[] args) throws ClassNotFoundException, IOException {
        // When run off the command-line or a build script, this program takes in two arguments: the path containing
        // class files to scan, and the output file to generate.
        long startTime = System.nanoTime();
        String path = args[0];
        String outputFile = args[1];
  
        System.out.printf(" [ComponentMetadataPersister] Starting component metadata generation.  Scanning classes in %s%n", path);
  
        ComponentMetadataRepo repo = new ComponentMetadataRepo();
  
        File f = new File(path);
        process(repo, f.getAbsolutePath(), f);
  
        // Test that all dependencies now exist in the component metadata map.
        Map<String, String> dependencies = new HashMap<>(128);
        for (ComponentMetadata md : repo.componentMetadataMap.values()) {
           if (md.getDependencies() != null) dependencies.putAll(md.getDependencies());
        }
  
        if (Boolean.getBoolean("infinispan.isCoreModule")) {
           // Perform this sanity check
           boolean hasErrors = false;
           for (Map.Entry<String, String> e : dependencies.entrySet()) {
              if (!repo.componentMetadataMap.containsKey(e.getKey())) {
                 if (!repo.hasFactory(e.getKey())) {
                    System.out.printf(" [ComponentMetadataPersister]     **** WARNING!!!  Missing components or factories for dependency on %s%n", e.getKey());
                    hasErrors = true;
                 }
              }
           }
  
           if (hasErrors && Boolean.getBoolean("infinispan.isCoreModule"))
              throw new RuntimeException("Could not pass sanity check of all annotated components and their respective factories/dependencies.");
        }
        writeMetadata(repo, outputFile);
  
        System.out.printf(" [ComponentMetadataPersister] %s components and %s factories.%n%n",
              repo.componentMetadataMap.size(), repo.factories.size());
     }