@Override
	public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch,
			IProgressMonitor monitor) throws CoreException {

		try {
			ILaunchConfigurationWorkingCopy wc = configuration.getWorkingCopy();

			// Get project
			String projectName = wc.getAttribute(PyDevUtils.getAttrProject(), "");
			IJavaProject javaProject = GhidraProjectUtils.getGhidraProject(projectName);
			if (javaProject == null) {
				EclipseMessageUtils.showErrorDialog("Failed to launch project \"" + projectName +
					"\".\nDoes not appear to be a Ghidra project.");
				return;
			}
			IProject project = javaProject.getProject();

			// Get needed application.properties values
			String javaComplianceLevel = null;
			String ghidraVmErrorMsg = "";
			try {
				IFolder ghidraFolder = project.getFolder(GhidraProjectUtils.GHIDRA_FOLDER_NAME);
				String ghidraInstallPath = ghidraFolder.getLocation().toOSString();
				AppConfig appConfig = new AppConfig(new File(ghidraInstallPath));
				javaComplianceLevel = appConfig.getCompilerComplianceLevel();
			}
			catch (ParseException | IOException e) {
				ghidraVmErrorMsg = e.getMessage();
			}
			if (javaComplianceLevel == null) {
				EclipseMessageUtils
						.showErrorDialog("Failed to get JVM compliance level from project \"" +
							projectName + "\".\n" + ghidraVmErrorMsg);
				return;
			}

			// Set program location
			wc.setAttribute(PyDevUtils.getAttrLocation(),
				"${workspace_loc:%s/Ghidra/Ghidra/Features/PyGhidra/pypkg/src/pyghidra}"
						.formatted(project.getName()));

			// Set program arguments
			wc.setAttribute(PyDevUtils.getAttrProgramArguments(), "-v -g");

			// Set Python interpreter
			String interpreterName = PyDevUtils.getInterpreterName(project);
			wc.setAttribute(PyDevUtils.getAttrInterpreter(), interpreterName);
			wc.setAttribute(PyDevUtils.getAttrInterpreterDefault(), interpreterName);

			// Set environment variables
			Map<String, String> env = new HashMap<>();
			//env.put("GHIDRA_INSTALL_DIR", "${project_loc:/%s/Ghidra}".formatted(project.getName()));
			env.put("GHIDRA_INSTALL_DIR",
				"${resource_loc:/%s/Ghidra}".formatted(project.getName()));
			env.put("JAVA_HOME_OVERRIDE", "${ee_home:JavaSE-%s}".formatted(javaComplianceLevel));
			if (mode.equals("debug")) {
				env.put("PYGHIDRA_DEBUG", "1");
				handleDebugMode();
			}
			wc.setAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, env);

			super.launch(wc.doSave(), mode, launch, monitor);
		}
		catch (OperationNotSupportedException e) {
			EclipseMessageUtils.showErrorDialog("PyDev error",
				"Failed to launch. PyDev version is not supported.");
		}
	}
The PyGhidra Launch delegate handles the final launch of PyGhidra.
We can do any extra custom launch behavior here.
GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/src/main/java/ghidradev/ghidraprojectcreator/launchers/PyGhidraLaunchDelegate.java