private static List<String> buildClasspath(GhidraApplicationLayout layout) throws IOException {

		List<String> classpathList = new ArrayList<>();
		Map<String, GModule> modules = getOrderedModules(layout);

		// First add any "bin" paths the module might have. These could come from external modules
		// being developed and passed in via system property if we are in release mode, or they 
		// could be generated for each Ghidra module by Eclipse if we are in development mode.
		addModuleBinPaths(classpathList, modules);

		if (SystemUtilities.isInDevelopmentMode()) {

			// If we didn't find any "bin" paths and we are in development mode, assume Ghidra was 
			// compiled with Gradle, and add the module jars Gradle built.
			boolean gradleDevMode = classpathList.isEmpty();
			if (gradleDevMode) {
				// Add the module jars Gradle built.
				// Note: this finds Extensions' jar files so there is no need to call
				// addExtensionJarPaths()
				addModuleJarPaths(classpathList, modules);
			}
			else { /* Eclipse dev mode */
				// Support loading pre-built, jar-based, non-repo extensions in Eclipse dev mode
				addExtensionJarPaths(classpathList, modules, layout);
			}

			// In development mode, 3rd party library jars do not live in module directories. 
			// Instead, each jar lives in an external, non-repo location, which is listed in 
			// build/libraryDependencies.txt.
			addExternalJarPaths(classpathList, layout.getApplicationRootDirs());
		}
		else {

			// Release mode is simple.  We expect all of Ghidra's modules to be in pre-build jars.
			addPatchPaths(classpathList, layout.getPatchDir());
			addModuleJarPaths(classpathList, modules);
		}

		//
		// The framework may choose to handle extension class loading separately from all other 
		// class loading.  In that case, we will separate the extension jar files from standard 
		// module jar files. 
		//
		// (If the custom extension class loading is disabled, then the extensions will be put onto
		// the standard classpath.)
		setExtensionJarPaths(modules, layout, classpathList);

		// Ghidra launches from the Utility module, so it's already on the classpath.  We don't
		// want to add it a second time, so remove the one we discovered.
		GModule utilityModule = modules.get("Utility");
		if (utilityModule == null) {
			throw new IOException("Failed to find the 'Utility' module!");
		}
		classpathList.removeIf(
			e -> e.startsWith(utilityModule.getModuleRoot().getAbsolutePath()));

		return orderClasspath(classpathList, modules);
	}
Builds and returns a classpath from the given {@link GhidraApplicationLayout layout}
<p>
NOTE: This method does NOT add the built classpath to a classloader...it just returns it

@param layout Ghidra's {@link GhidraApplicationLayout layout}
@return A {@link List} of classpath entries
@throws IOException if there was an IO-related issue with building the classpath
Ghidra/Framework/Utility/src/main/java/ghidra/GhidraLauncher.java