protected Map<String, GModule> findModules() {
		if (!SystemUtilities.isInDevelopmentMode()) {
			// in release mode we only have one application root, so no need to find all others
			return ModuleUtilities.findModules(applicationRootDirs, applicationRootDirs);
		}

		// In development mode we may have multiple module root directories under which modules may
		// be found.  Search all roots for modules.
		Collection<ResourceFile> roots =
			ModuleUtilities.findModuleRootDirectories(applicationRootDirs, new ArrayList<>());
		Map<String, GModule> allModules = ModuleUtilities.findModules(applicationRootDirs, roots);

		// Filter any modules found to ensure that we only include those that are listed on the
		// classpath.  (Due to the nature of how the development classpath is created, not all
		// found modules may match the classpath entries.)
		Set<String> cpNames = getClassPathModuleNames();
		Map<String, GModule> filteredModules = new HashMap<>();
		Set<Entry<String, GModule>> entrySet = allModules.entrySet();
		for (Entry<String, GModule> entry : entrySet) {
			GModule module = entry.getValue();
			if (cpNames.contains(module.getName())) {
				filteredModules.put(entry.getKey(), module);
			}
		}

		return filteredModules;
	}
Constructs a new application layout object with the given set of application
properties.

@param applicationRootDirs list of application root directories which should be
used to identify modules and resources.  The first entry will be treated as the
installation root.
@param applicationProperties The properties object that will be read system properties.
@throws IOException if there was a problem getting a user directory.
Ghidra/Framework/Generic/src/main/java/generic/application/GenericApplicationLayout.java