setClasspath(manifestClassPathEntryList);
String[] argv = project.getJarFileArray();
  public void execute() throws java.io.IOException, InterruptedException {	// Configure the analysis context	AnalysisContext analysisContext = AnalysisContext.instance();	analysisContext.setLookupFailureCallback(bugReporter);	analysisContext.setSourcePath(project.getSourceDirList());	// Create detectors, if required	if (detectors == null)		createDetectors();	// Create list of class producers; they are the source of	// all classes to be directly analyzed.	// As a side effect, this will examine all Jar file manifests	// for entries to add to the aux classpath.	List<String> manifestClassPathEntryList = new LinkedList<String>();	List<ClassProducer> classProducerList = new LinkedList<ClassProducer>();	String[] argv = project.getJarFileArray();	progressCallback.reportNumberOfArchives(argv.length);	for (int i = 0; i < argv.length; i++) {	    String fileName = argv[i];	    // Create the ClassProducer	    if (fileName.endsWith(".jar") ||		fileName.endsWith(".zip") ||		fileName.endsWith(".war") ||		fileName.endsWith(".ear")) {		// This might be a jar file, in which case the		// manifest is scanned for Class-Path entries		// which we will add to the aux classpath.		ZipClassProducer zipClassProducer = new ZipClassProducer(fileName);		zipClassProducer.addAuxClasspathEntries(manifestClassPathEntryList);		classProducerList.add(zipClassProducer);	    } else if (fileName.endsWith(".class"))		classProducerList.add(new SingleClassProducer(fileName));	    else {		File dir = new File(fileName);		if (!dir.isDirectory())		    throw new IOException("Path " + fileName + " is not an archive, class file, or directory");		classProducerList.add(new DirectoryClassProducer(fileName));	    }	}	// Clear repository and analysis context cache of all class files	clearRepository();	// Set the classpath to be used for class lookups.	setClasspath(manifestClassPathEntryList);	// Scan all jar files and directories,	// making a list of all classes encountered.	// We also keep track of all resources referenced by	// Class-Path entries in the manifests of scanned jar	// files, in order to add them to the auxiliary classpath	// when the analysis is performed.	List<String> repositoryClassList = new LinkedList<String>();	for (Iterator<ClassProducer> i = classProducerList.iterator(); i.hasNext(); ) {		ClassProducer classProducer = i.next();		addFileToRepository(classProducer, repositoryClassList);	}	// Examine all classes for bugs.	// Don't examine the same class more than once.	// (The user might specify two jar files that contain	// the same class.)	progressCallback.startAnalysis(repositoryClassList.size());	Set<String> examinedClassSet = new HashSet<String>();	for (Iterator<String> i = repositoryClassList.iterator(); i.hasNext(); ) {		String className = i.next();		if (examinedClassSet.add(className))			examineClass(className);		}	progressCallback.finishPerClassAnalysis();	// Notify detectors that analysis is finished and they should	// generate reports about accumulated data.	this.reportFinal();	// Flush any queued bug reports	bugReporter.finish();	// Flush any queued error reports	bugReporter.reportQueuedErrors();  }