Copyright (c) 2000, 2019 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
/*******************************************************************************
* Copyright (c) 2000, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.launching;
import java.io.File;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IModuleDescription;
import org.eclipse.jdt.internal.launching.LaunchingMessages;
import org.eclipse.jdt.launching.sourcelookup.advanced.AdvancedJavaLaunchDelegate;
import org.eclipse.osgi.util.NLS;
A launch delegate for launching local Java applications.
Clients may subclass and instantiate this class.
See Also: - AdvancedJavaLaunchDelegate
Since: 3.1
/**
* A launch delegate for launching local Java applications.
* <p>
* Clients may subclass and instantiate this class.
* </p>
*
* @see AdvancedJavaLaunchDelegate
* @since 3.1
*/
public class JavaLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate {
@Override
public String showCommandLine(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
try {
VMRunnerConfiguration runConfig = getVMRunnerConfiguration(configuration, mode, monitor);
if (runConfig == null) {
return ""; //$NON-NLS-1$
}
IVMRunner runner = getVMRunner(configuration, mode);
String cmdLine = runner.showCommandLine(runConfig, launch, monitor);
// check for cancellation
if (monitor.isCanceled()) {
return ""; //$NON-NLS-1$
}
return cmdLine;
} finally {
monitor.done();
}
}
@SuppressWarnings("deprecation")
private VMRunnerConfiguration getVMRunnerConfiguration(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
monitor.beginTask(NLS.bind("{0}...", new String[]{configuration.getName()}), 3); //$NON-NLS-1$
// check for cancellation
if (monitor.isCanceled()) {
return null;
}
monitor.subTask(LaunchingMessages.JavaLocalApplicationLaunchConfigurationDelegate_Verifying_launch_attributes____1);
String mainTypeName = verifyMainTypeName(configuration);
File workingDir = verifyWorkingDirectory(configuration);
String workingDirName = null;
if (workingDir != null) {
workingDirName = workingDir.getAbsolutePath();
}
// Environment variables
String[] envp = getEnvironment(configuration);
// Program & VM arguments
String pgmArgs = getProgramArguments(configuration);
String vmArgs = concat(getVMArguments(configuration), getVMArguments(configuration, mode));
ExecutionArguments execArgs = new ExecutionArguments(vmArgs, pgmArgs);
// VM-specific attributes
Map<String, Object> vmAttributesMap = getVMSpecificAttributesMap(configuration);
// Create VM config
// Bug 529435 :to move to getClasspathAndModulepath after java 8 is sunset
VMRunnerConfiguration runConfig = new VMRunnerConfiguration(mainTypeName, getClasspath(configuration));
runConfig.setProgramArguments(execArgs.getProgramArgumentsArray());
runConfig.setEnvironment(envp);
runConfig.setVMArguments(execArgs.getVMArgumentsArray());
runConfig.setWorkingDirectory(workingDirName);
runConfig.setVMSpecificAttributesMap(vmAttributesMap);
runConfig.setPreviewEnabled(supportsPreviewFeatures(configuration));
if (supportsModule()) {
// current module name, if so
try {
IJavaProject proj = JavaRuntime.getJavaProject(configuration);
if (proj != null) {
IModuleDescription module = proj == null ? null : proj.getModuleDescription();
String modName = module == null ? null : module.getElementName();
if (modName != null) {
runConfig.setModuleDescription(modName);
}
}
} catch (CoreException e) {
// Not a java Project so no need to set module description
}
}
// Launch Configuration should be launched by Java 9 or above for modulepath setting
if (!JavaRuntime.isModularConfiguration(configuration)) {
// Bootpath
runConfig.setBootClassPath(getBootpath(configuration));
} else if (supportsModule()) {
// module path
String[][] paths = getClasspathAndModulepath(configuration);
if (paths != null && paths.length > 1) {
runConfig.setModulepath(paths[1]);
}
if (!configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_MODULE_CLI_OPTIONS, true)) {
runConfig.setOverrideDependencies(configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MODULE_CLI_OPTIONS, "")); //$NON-NLS-1$
} else {
runConfig.setOverrideDependencies(getModuleCLIOptions(configuration));
}
}
runConfig.setMergeOutput(configuration.getAttribute(DebugPlugin.ATTR_MERGE_OUTPUT, false));
// check for cancellation
if (monitor.isCanceled()) {
return null;
}
monitor.worked(1);
return runConfig;
}
@Override
public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
try {
VMRunnerConfiguration runConfig = getVMRunnerConfiguration(configuration, mode, monitor);
if (runConfig == null) {
return;
}
// stop in main
prepareStopInMain(configuration);
// done the verification phase
monitor.worked(1);
monitor.subTask(LaunchingMessages.JavaLocalApplicationLaunchConfigurationDelegate_Creating_source_locator____2);
// set the default source locator if required
setDefaultSourceLocator(launch, configuration);
monitor.worked(1);
// Launch the configuration - 1 unit of work
IVMRunner runner = getVMRunner(configuration, mode);
runner.run(runConfig, launch, monitor);
// check for cancellation
if (monitor.isCanceled()) {
return;
}
}
finally {
monitor.done();
}
}
private static String concat(String args1, String args2) {
StringBuilder args = new StringBuilder();
if (args1 != null && !args1.isEmpty()) {
args.append(args1);
}
if (args2 != null && !args2.isEmpty()) {
args.append(" "); //$NON-NLS-1$
args.append(args2);
}
return args.toString();
}
}