static void processJarFile()

in disco-java-agent/disco-java-agent-core/src/main/java/software/amazon/disco/agent/plugin/PluginDiscovery.java [202:243]


    static void processJarFile(Instrumentation instrumentation, File jarFile, boolean runtimeOnly) throws Exception {
        JarFile jar = new JarFile(jarFile);
        Manifest manifest = jar.getManifest();
        jar.close();
        if (manifest == null) {
            log.info("DiSCo(Core) JAR file without manifest found on plugin path, skipping this file");
            return;
        }

        Attributes attributes = manifest.getMainAttributes();
        if (attributes == null || attributes.isEmpty()) {
            log.info("DiSCo(Core) JAR file found with manifest without any main attributes, skipping this file");
            return;
        }

        //read each pertinent Manifest attribute
        String initClassName = attributes.getValue("Disco-Init-Class");
        String installableClassNames = attributes.getValue("Disco-Installable-Classes");
        String listenerClassNames = attributes.getValue("Disco-Listener-Classes");
        String bootstrapClassloader = attributes.getValue("Disco-Bootstrap-Classloader");

        //check that at least one of the attributes is present
        boolean isPlugin =
                (initClassName != null)
              || installableClassNames != null
              || listenerClassNames != null
              || bootstrapClassloader != null;

        if (!isPlugin) {
            log.info("DiSCo(Core) JAR file manifest contains no Disco attributes, skipping this file");
            return;
        }

        //process the plugin based on the Manifest
        String pluginName = jarFile.getName();
        pluginOutcomes.put(pluginName, new PluginOutcome(pluginName));
        boolean bootstrap = loadJar(instrumentation, jarFile, bootstrapClassloader);
        pluginOutcomes.get(pluginName).bootstrap = bootstrap;
        processInitClass(pluginName, initClassName, bootstrap);
        processInstallableClasses(pluginName, installableClassNames, bootstrap, runtimeOnly);
        processListenerClasses(pluginName, listenerClassNames, bootstrap);
    }