Revert "Bug 565902 - Support for argument files during launch"
This reverts commit 1727be6d7828faaaefec71c2c63c994cacaa77fc.
Reason for revert: This has caused few regressions and we will take this up in 4.18.
Change-Id: I9d6f32df3c638c63bb5bdd7cc60ece2397a1fe91
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
index d365270..10086fb 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
@@ -55,7 +55,6 @@
import org.eclipse.jdt.debug.tests.console.JavaStackTraceConsoleTest;
import org.eclipse.jdt.debug.tests.core.AlternateStratumTests;
import org.eclipse.jdt.debug.tests.core.ArgumentTests;
-import org.eclipse.jdt.debug.tests.core.ArgumentTestsWithArgfile;
import org.eclipse.jdt.debug.tests.core.ArrayTests;
import org.eclipse.jdt.debug.tests.core.BootpathTests;
import org.eclipse.jdt.debug.tests.core.ClasspathContainerTests;
@@ -245,7 +244,6 @@
addTest(new TestSuite(EnvironmentTests.class));
addTest(new TestSuite(ExecutionEnvironmentTests.class));
addTest(new TestSuite(ArgumentTests.class));
- addTest(new TestSuite(ArgumentTestsWithArgfile.class));
//Console tests
addTest(new TestSuite(ConsoleTests.class));
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTests.java
index 50a9967..3c22791 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTests.java
@@ -13,20 +13,13 @@
*******************************************************************************/
package org.eclipse.jdt.debug.tests.core;
-import static java.util.stream.Collectors.joining;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
@@ -49,7 +42,6 @@
public class ArgumentTests extends AbstractDebugTest {
private Object fLock = new Object();
- protected boolean fUseArgfile = false;
private class ConsoleArgumentOutputRetriever implements IConsoleLineTrackerExtension {
@@ -351,23 +343,20 @@
*/
private void testOutput(String mainTypeName, String vmArgs, String programArgs, String outputValue) throws CoreException {
ILaunchConfigurationWorkingCopy workingCopy = newConfiguration(null, "config1");
-
workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, get14Project().getProject().getName());
workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, mainTypeName);
workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_STOP_IN_MAIN, true);
workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, vmArgs);
workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, programArgs);
- workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_USE_ARGFILE, fUseArgfile);
- Map<String, String> env = getLaunchManager().getNativeEnvironment().entrySet().stream().filter(e -> !"JAVA_TOOL_OPTIONS".equals(e.getKey())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
- workingCopy.setAttribute(ILaunchManager.ATTR_APPEND_ENVIRONMENT_VARIABLES, false);
+ Map<String, String> env = getLaunchManager().getNativeEnvironment().entrySet().stream()
+ .filter(e -> !"JAVA_TOOL_OPTIONS".equals(e.getKey()))
+ .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+ workingCopy.setAttribute(ILaunchManager.ATTR_APPEND_ENVIRONMENT_VARIABLES, false);
workingCopy.setAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, env);
IVMInstall vm = JavaRuntime.getVMInstall(get14Project());
assertNotNull("shold be able to get the default VM install from the 1.4 project", vm);
- if (fUseArgfile) {
- assertTrue("test requires a JVM >= 9", JavaRuntime.isModularJava(vm));
- }
//workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_JRE_CONTAINER_PATH, JavaRuntime.newJREContainerPath(vm).toPortableString());
// use 'java' instead of 'javaw' to launch tests (javaw is problematic on JDK1.4.2)
@@ -379,37 +368,23 @@
ConsoleLineTracker.setDelegate(retriever);
IProcess process = null;
ILaunch launch = null;
- String commandLine = null;
try {
HashSet<String> set = new HashSet<>();
set.add(ILaunchManager.RUN_MODE);
ensurePreferredDelegate(workingCopy, set);
launch = workingCopy.launch(ILaunchManager.RUN_MODE, null);
process = launch.getProcesses()[0];
- commandLine = process.getAttribute(IProcess.ATTR_CMDLINE);
} catch (Exception e) {
e.printStackTrace();
}
- assertNotNull(commandLine);
- if (!fUseArgfile) {
- assertTrue("command line must not contain an @argfile", commandLine.indexOf(" @") == -1);
- } else {
- assertTrue("command line must contain an @argfile", commandLine.indexOf(" @") > -1);
- }
try {
String output = retriever.getOutput();
// output if in error
if (!outputValue.equals(output)) {
System.out.println();
System.out.println(getName());
- System.out.println("\tExpected: " + outputValue);
- System.out.println("\tActual: " + output);
- System.out.println("\tCommand Line: " + commandLine);
- if (fUseArgfile) {
- System.out.println("\tArgfile: "
- + readArgfile(commandLine).stream().collect(joining("\n\t ")));
- System.out.println();
- }
+ System.out.println("\tExpected: " + outputValue);
+ System.out.println("\tActual: " + output);
}
assertEquals(outputValue, output);
} finally {
@@ -423,18 +398,6 @@
}
}
- private List<String> readArgfile(String commandLine) {
- String[] arguments = DebugPlugin.parseArguments(commandLine);
- assertEquals("command line too long, only command @argfile expected", 2, arguments.length);
- String argfile = arguments[1];
- assertTrue("wrong command line, expected @argfile at index 1: " + commandLine, argfile != null && argfile.startsWith("@"));
- try {
- return Files.readAllLines(Path.of(argfile.substring(1)));
- } catch (IOException e) {
- throw new IllegalStateException("Error reading @argfile: " + argfile, e);
- }
- }
-
/**
* Tests the default VM args
* @throws CoreException
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTestsWithArgfile.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTestsWithArgfile.java
deleted file mode 100644
index ddd03ae..0000000
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ArgumentTestsWithArgfile.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.eclipse.jdt.debug.tests.core;
-
-public class ArgumentTestsWithArgfile extends ArgumentTests {
-
- public ArgumentTestsWithArgfile(String name) {
- super(name);
- fUseArgfile = true;
- }
-
-}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaArgumentsTab.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaArgumentsTab.java
index e1c3d37..093772a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaArgumentsTab.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/debug/ui/launchConfigurations/JavaArgumentsTab.java
@@ -320,7 +320,6 @@
getAttributesLabelsForPrototype().put(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, LauncherMessages.JavaArgumentsTab_AttributeLabel_VMArguments);
getAttributesLabelsForPrototype().put(IJavaLaunchConfigurationConstants.ATTR_USE_START_ON_FIRST_THREAD, LauncherMessages.JavaArgumentsTab_AttributeLabel_UseAtStart);
getAttributesLabelsForPrototype().put(IJavaLaunchConfigurationConstants.ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES, LauncherMessages.JavaArgumentsTab_AttributeLabel_ActivateHelpfulNullPointerExceptions);
- getAttributesLabelsForPrototype().put(IJavaLaunchConfigurationConstants.ATTR_USE_ARGFILE, LauncherMessages.JavaArgumentsTab_AttributeLabel_UseArgfile);
getAttributesLabelsForPrototype().put(IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, LauncherMessages.JavaArgumentsTab_AttributeLabel_WorkingDirectory);
}
}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.java
index ef34e7d..eea647b 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.java
@@ -31,8 +31,6 @@
public static String JavaArgumentsTab_AttributeLabel_UseAtStart;
public static String JavaArgumentsTab_AttributeLabel_ActivateHelpfulNullPointerExceptions;
public static String JavaArgumentsTab_AttributeTooltip_ActivateHelpfulNullPointerExceptions;
- public static String JavaArgumentsTab_AttributeLabel_UseArgfile;
- public static String JavaArgumentsTab_AttributeTooltip_UseArgfile;
public static String JavaArgumentsTab_AttributeLabel_WorkingDirectory;
@@ -57,7 +55,6 @@
public static String VMArgumentsBlock_0;
public static String VMArgumentsBlock_1;
public static String VMArgumentsBlock_2;
- public static String VMArgumentsBlock_3;
public static String VMArgumentsBlock_VM_Arguments;
public static String VMArgumentsBlock_4;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.properties b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.properties
index fac6a6f..02c59f3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.properties
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/LauncherMessages.properties
@@ -24,9 +24,7 @@
JavaArgumentsTab_AttributeLabel_VMArguments=VM arguments
JavaArgumentsTab_AttributeLabel_UseAtStart=Use at start on 1st thread
JavaArgumentsTab_AttributeLabel_WorkingDirectory=WorkingDirectory
-JavaArgumentsTab_AttributeLabel_UseArgfile=Use @&argfile
JavaArgumentsTab_AttributeTooltip_ActivateHelpfulNullPointerExceptions=You need at least Java14 to make use of it!
-JavaArgumentsTab_AttributeTooltip_UseArgfile=Write all arguments into an @argfile to allow an unlimited number when launching with Java 9 or higher.
RuntimeClasspathAdvancedDialog_6=Add &Variable String:
RuntimeClasspathAdvancedDialog_7=Va&riables...
@@ -34,7 +32,6 @@
VMArgumentsBlock_0=Use the -&XstartOnFirstThread argument when launching with SWT
VMArgumentsBlock_1=Use temporary JAR to speci&fy classpath (to avoid classpath length limitations)
VMArgumentsBlock_2=Use the -XX:+ShowCode&DetailsInExceptionMessages argument when launching
-VMArgumentsBlock_3=Use @&argfile when launching
VMArgumentsBlock_VM_Arguments=VM Arguments
JavaConnectTab__Allow_termination_of_remote_VM_6=&Allow termination of remote VM
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMArgumentsBlock.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMArgumentsBlock.java
index 8e7ced3..b99745e 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMArgumentsBlock.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/VMArgumentsBlock.java
@@ -46,7 +46,6 @@
protected Text fVMArgumentsText;
private Button fUseStartOnFirstThread = null;
private Button fHelpfulExceptions = null;
- private Button fUseArgfile = null;
private Button fPgrmArgVariableButton;
/**
@@ -123,15 +122,6 @@
scheduleUpdateJob();
}
});
- fUseArgfile = SWTFactory.createCheckButton(group, LauncherMessages.VMArgumentsBlock_3, null, true, 1);
- fUseArgfile.setEnabled(false);
- fUseArgfile.setToolTipText(LauncherMessages.JavaArgumentsTab_AttributeTooltip_UseArgfile);
- fUseArgfile.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- scheduleUpdateJob();
- }
- });
}
/**
@@ -142,7 +132,6 @@
configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, (String)null);
configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_USE_START_ON_FIRST_THREAD, true);
configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES, true);
- configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_USE_ARGFILE, false);
}
/**
@@ -158,9 +147,6 @@
if (fHelpfulExceptions != null) {
fHelpfulExceptions.setSelection(configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES, true));
}
- if (fUseArgfile != null) {
- fUseArgfile.setSelection(configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_USE_ARGFILE, true));
- }
} catch (CoreException e) {
setErrorMessage(LauncherMessages.JavaArgumentsTab_Exception_occurred_reading_configuration___15 + e.getStatus().getMessage());
JDIDebugUIPlugin.log(e);
@@ -182,12 +168,6 @@
} else {
fHelpfulExceptions.setEnabled(false);
}
- if (isJavaNewerThan(configuration, JavaCore.VERSION_1_8)) {
- configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_USE_ARGFILE, fUseArgfile.getSelection());
- fUseArgfile.setEnabled(true);
- } else {
- fUseArgfile.setEnabled(false);
- }
}
/**
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/CommandLineQuoting.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/CommandLineQuoting.java
deleted file mode 100644
index 9ca92a7..0000000
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/CommandLineQuoting.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.jdt.internal.launching;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.osgi.service.environment.Constants;
-
-/**
- * Utility for quoting of command line Arguments
- */
-public class CommandLineQuoting {
-
- private CommandLineQuoting() {
- // empty
- }
-
- public static String[] quoteWindowsArgs(String[] cmdLine) {
- // see https://bugs.eclipse.org/387504 , workaround for http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511002
- if (Platform.getOS().equals(Constants.OS_WIN32)) {
- String[] winCmdLine = new String[cmdLine.length];
- if (cmdLine.length > 0) {
- winCmdLine[0] = cmdLine[0];
- }
- for (int i = 1; i < cmdLine.length; i++) {
- winCmdLine[i] = winQuote(cmdLine[i]);
- }
- cmdLine = winCmdLine;
- }
- return cmdLine;
- }
-
- static boolean needsQuoting(String s) {
- int len = s.length();
- if (len == 0) {
- return true;
- }
- if ("\"\"".equals(s)) //$NON-NLS-1$
- {
- return false; // empty quotes must not be quoted again
- }
- for (int i = 0; i < len; i++) {
- switch (s.charAt(i)) {
- case ' ':
- case '\t':
- case '\\':
- case '"':
- return true;
- }
- }
- return false;
- }
-
- private static String winQuote(String s) {
- if (!needsQuoting(s)) {
- return s;
- }
- s = s.replaceAll("([\\\\]*)\"", "$1$1\\\\\""); //$NON-NLS-1$ //$NON-NLS-2$
- s = s.replaceAll("([\\\\]*)\\z", "$1$1"); //$NON-NLS-1$ //$NON-NLS-2$
- return "\"" + s + "\""; //$NON-NLS-1$ //$NON-NLS-2$
- }
-
-}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/CommandLineShortener.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/CommandLineShortener.java
deleted file mode 100644
index c2b1f0d..0000000
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/CommandLineShortener.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2020 Gunnar Wagenknecht 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:
- * Gunnar Wagenknecht - copied from ClasspathShortener and simplified to shorten all arguments
- *******************************************************************************/
-package org.eclipse.jdt.internal.launching;
-
-import static org.eclipse.jdt.internal.launching.LaunchingPlugin.LAUNCH_TEMP_FILE_PREFIX;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jdt.launching.IVMInstall;
-import org.eclipse.jdt.launching.IVMInstall2;
-import org.eclipse.osgi.service.environment.Constants;
-
-/**
- * Shortens the command line by writing all commands into an arguments file.
- */
-public class CommandLineShortener {
- public static String getJavaVersion(IVMInstall vmInstall) {
- if (vmInstall instanceof IVMInstall2) {
- IVMInstall2 install = (IVMInstall2) vmInstall;
- return install.getJavaVersion();
- }
- return null;
- }
-
- private final String javaVersion;
- private final ILaunch launch;
- private final String[] cmdLine;
- private File processTempFilesDir;
-
- private final List<File> processTempFiles = new ArrayList<>();
-
- /**
- *
- * @param vmInstall
- * the vm installation
- * @param launch
- * the launch
- * @param cmdLine
- * the command line (java executable + VM arguments + program arguments)
- * @param lastJavaArgumentIndex
- * the index of the last java argument in cmdLine (next arguments if any are program arguments)
- * @param workingDir
- * the working dir to use for the launched VM or null
- * @param envp
- * array of strings, each element of which has environment variable settings in the format name=value, or null if the subprocess should
- * inherit the environment of the current process.
- */
- public CommandLineShortener(IVMInstall vmInstall, ILaunch launch, String[] cmdLine, File workingDir) {
- this(getJavaVersion(vmInstall), launch, cmdLine, workingDir);
- }
-
- protected CommandLineShortener(String javaVersion, ILaunch launch, String[] cmdLine, File workingDir) {
- Assert.isNotNull(javaVersion);
- Assert.isNotNull(launch);
- Assert.isNotNull(cmdLine);
- this.javaVersion = javaVersion;
- this.launch = launch;
- this.cmdLine = cmdLine;
- this.processTempFilesDir = workingDir != null ? workingDir : Paths.get(".").toAbsolutePath().normalize().toFile(); //$NON-NLS-1$
- }
-
- protected void addProcessTempFile(File file) {
- processTempFiles.add(file);
- }
-
- protected File createArgumentFile(String[] cmdLine) throws CoreException {
- try {
- String timeStamp = getLaunchTimeStamp();
- File argumentsFile = new File(processTempFilesDir, String.format(LAUNCH_TEMP_FILE_PREFIX
- + "%s-args-%s.txt", getLaunchConfigurationName(), timeStamp)); //$NON-NLS-1$
-
- cmdLine = quoteForArgfile(cmdLine);
-
- Files.write(argumentsFile.toPath(), Arrays.asList(cmdLine));
- return argumentsFile;
- } catch (IOException e) {
- throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IStatus.ERROR, "Cannot create argument file", e)); //$NON-NLS-1$
- }
- }
-
- String[] quoteForArgfile(String[] cmdLine) {
- if (Platform.getOS().equals(Constants.OS_WIN32)) {
- return CommandLineQuoting.quoteWindowsArgs(cmdLine);
- }
-
- String[] quotedCmdLine = new String[cmdLine.length];
- for (int i = 0; i < cmdLine.length; i++) {
- String arg = cmdLine[i];
- if (CommandLineQuoting.needsQuoting(arg)) {
- StringBuilder escapedArg = new StringBuilder();
- for (int j = 0; j < arg.length(); j++) {
- char c = arg.charAt(j);
- if (c == '\\') {
- escapedArg.append('\\');
- } else if (c == '\"') {
- escapedArg.append('\\');
- }
- escapedArg.append(c);
- }
- arg = "\"" + escapedArg.toString() + "\""; //$NON-NLS-1$ //$NON-NLS-2$
- }
- quotedCmdLine[i] = arg;
- }
- return quotedCmdLine;
- }
-
- protected String getLaunchConfigurationName() {
- return launch.getLaunchConfiguration().getName();
- }
-
- protected String getLaunchTimeStamp() {
- String timeStamp = launch.getAttribute(DebugPlugin.ATTR_LAUNCH_TIMESTAMP);
- if (timeStamp == null) {
- timeStamp = Long.toString(System.currentTimeMillis());
- }
- return timeStamp;
- }
-
- /**
- * The files that were created while shortening the path. They can be deleted once the process is terminated
- *
- * @return created files
- */
- public List<File> getProcessTempFiles() {
- return new ArrayList<>(processTempFiles);
- }
-
- public File getProcessTempFilesDir() {
- return processTempFilesDir;
- }
-
- /**
- * @return the original, unshortened command line
- */
- public String[] getOriginalCmdLine() {
- return cmdLine;
- }
-
- /**
- * @return <code>true</code> if the JVM supports launching with argument files, <code>false</code> otherwise
- */
- protected boolean isArgumentFileSupported() {
- return JavaCore.compareJavaVersions(javaVersion, JavaCore.VERSION_9) >= 0;
- }
-
- /**
- * The directory to use to create temp files needed when shortening the classpath. By default, the working directory is used
- *
- * The java.io.tmpdir should not be used on MacOs (does not work for classpath-only jars)
- *
- * @param processTempFilesDir
- */
- public void setProcessTempFilesDir(File processTempFilesDir) {
- this.processTempFilesDir = processTempFilesDir;
- }
-
- /**
- * Writes the command line into an arguments file and returns the shortened command line.
- *
- * @return a shortened command line
- * @throws CoreException
- */
- public String[] shortenCommandLine() throws CoreException {
- List<String> fullCommandLine = new ArrayList<>(Arrays.asList(cmdLine));
- List<String> shortCommandLine = new ArrayList<>();
-
- shortCommandLine.add(fullCommandLine.remove(0));
-
- File argumentFile = createArgumentFile(fullCommandLine.toArray(new String[fullCommandLine.size()]));
- addProcessTempFile(argumentFile);
- shortCommandLine.add("@" + argumentFile.getAbsolutePath());//$NON-NLS-1$
-
- return shortCommandLine.toArray(new String[shortCommandLine.size()]);
- }
-
- /**
- * Indicates if the command line {@link #isArgumentFileSupported() can} and should be shortened.
- * <p>
- * The command line should only be shortened if at least Java 9 is used and the launch is configured to do so.
- * </p>
- *
- * @return <code>true</code> if {@link #isArgumentFileSupported()} returns <code>true</code> and command line should be shortened,
- * <code>false</code> otherwise
- * @throws CoreException
- */
- public boolean shouldShortenCommandLine() throws CoreException {
- if (!isArgumentFileSupported()) {
- return false;
- }
-
- if (cmdLine.length < 2) {
- // no need to shorten if it's just the program argument
- return false;
- }
-
- ILaunchConfiguration configuration = launch.getLaunchConfiguration();
- if (configuration != null) {
- return configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_USE_ARGFILE, true);
- }
-
- return false;
- }
-}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java
index fea720b..f89b4c7 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java
@@ -13,6 +13,7 @@
*******************************************************************************/
package org.eclipse.jdt.internal.launching;
+
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
@@ -24,7 +25,6 @@
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -43,6 +43,7 @@
import org.eclipse.jdt.launching.VMRunnerConfiguration;
import org.eclipse.osgi.util.NLS;
+
/**
* A launcher for running Java main classes.
*/
@@ -350,7 +351,6 @@
private String[] envp;
private File workingDir;
private ClasspathShortener classpathShortener;
- private CommandLineShortener commandLineShortener;
private int port;
public String[] getEnvp() {
@@ -385,14 +385,6 @@
this.classpathShortener = classpathShortener;
}
- public CommandLineShortener getCommandLineShortener() {
- return commandLineShortener;
- }
-
- public void setCommandLineShortener(CommandLineShortener commandLineShortener) {
- this.commandLineShortener = commandLineShortener;
- }
-
public int getPort() {
return port;
}
@@ -485,16 +477,11 @@
if (newCmdLine != null) {
cmdLine = newCmdLine;
}
- CommandLineShortener commandLineShortener = new CommandLineShortener(fVMInstance, launch, newCmdLine, workingDir);
- if (commandLineShortener.shouldShortenCommandLine()) {
- cmdLine = commandLineShortener.shortenCommandLine();
- }
CommandDetails cmd = new CommandDetails();
cmd.setCommandLine(cmdLine);
cmd.setEnvp(envp);
cmd.setWorkingDir(workingDir);
cmd.setClasspathShortener(classpathShortener);
- cmd.setCommandLineShortener(commandLineShortener);
subMonitor.worked(1);
return cmd;
}
@@ -544,9 +531,8 @@
}
process.setAttribute(DebugPlugin.ATTR_ENVIRONMENT, buff.toString());
}
- if (!cmdDetails.getClasspathShortener().getProcessTempFiles().isEmpty()
- || !cmdDetails.getCommandLineShortener().getProcessTempFiles().isEmpty()) {
- String tempFiles = Stream.concat(cmdDetails.getClasspathShortener().getProcessTempFiles().stream(), cmdDetails.getCommandLineShortener().getProcessTempFiles().stream()).map(File::getAbsolutePath).collect(Collectors.joining(File.pathSeparator));
+ if (!cmdDetails.getClasspathShortener().getProcessTempFiles().isEmpty()) {
+ String tempFiles = cmdDetails.getClasspathShortener().getProcessTempFiles().stream().map(File::getAbsolutePath).collect(Collectors.joining(File.pathSeparator));
process.setAttribute(LaunchingPlugin.ATTR_LAUNCH_TEMP_FILES, tempFiles);
}
subMonitor.worked(1);
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMRunner.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMRunner.java
index 5ce14ef..e6ef2e6 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMRunner.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/AbstractVMRunner.java
@@ -21,6 +21,7 @@
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.variables.IStringVariableManager;
import org.eclipse.core.variables.VariablesPlugin;
@@ -28,9 +29,9 @@
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.launching.CommandLineQuoting;
import org.eclipse.jdt.internal.launching.LaunchingMessages;
import org.eclipse.jdt.internal.launching.LaunchingPlugin;
+import org.eclipse.osgi.service.environment.Constants;
/**
* Abstract implementation of a VM runner.
@@ -120,7 +121,46 @@
* @since 3.11
*/
protected static String[] quoteWindowsArgs(String[] cmdLine) {
- return CommandLineQuoting.quoteWindowsArgs(cmdLine);
+ // see https://bugs.eclipse.org/387504 , workaround for http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511002
+ if (Platform.getOS().equals(Constants.OS_WIN32)) {
+ String[] winCmdLine = new String[cmdLine.length];
+ if(cmdLine.length > 0) {
+ winCmdLine[0] = cmdLine[0];
+ }
+ for (int i = 1; i < cmdLine.length; i++) {
+ winCmdLine[i] = winQuote(cmdLine[i]);
+ }
+ cmdLine = winCmdLine;
+ }
+ return cmdLine;
+ }
+
+
+ private static boolean needsQuoting(String s) {
+ int len = s.length();
+ if (len == 0) {
+ return true;
+ }
+ if ("\"\"".equals(s)) //$NON-NLS-1$
+ {
+ return false; // empty quotes must not be quoted again
+ }
+ for (int i = 0; i < len; i++) {
+ switch (s.charAt(i)) {
+ case ' ': case '\t': case '\\': case '"':
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static String winQuote(String s) {
+ if (! needsQuoting(s)) {
+ return s;
+ }
+ s = s.replaceAll("([\\\\]*)\"", "$1$1\\\\\""); //$NON-NLS-1$ //$NON-NLS-2$
+ s = s.replaceAll("([\\\\]*)\\z", "$1$1"); //$NON-NLS-1$ //$NON-NLS-2$
+ return "\"" + s + "\""; //$NON-NLS-1$ //$NON-NLS-2$
}
/**
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IJavaLaunchConfigurationConstants.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IJavaLaunchConfigurationConstants.java
index 8e55ebb..ff147bb 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IJavaLaunchConfigurationConstants.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/IJavaLaunchConfigurationConstants.java
@@ -379,15 +379,6 @@
*/
public static final String ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES = LaunchingPlugin.getUniqueIdentifier()
+ ".ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES"; //$NON-NLS-1$
-
- /**
- * Attribute key to write arguments into an file when launching allowing an unlimited number of arguments. Only valid for java > 8 see
- * https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8027634
- *
- * @since 3.18
- */
- public static final String ATTR_USE_ARGFILE = LaunchingPlugin.getUniqueIdentifier() + ".ATTR_ATTR_USE_ARGFILE"; //$NON-NLS-1$
-
/**
* Launch configuration attribute key. The value is a boolean specifying whether output folders corresponding to test sources should not be added
* to the runtime classpath and test dependencies should not be added to the default classpath.