8276408: Deprecate Runtime.exec methods with a single string command line argument

Reviewed-by: alanb
This commit is contained in:
Roger Riggs 2021-11-08 16:39:07 +00:00
parent 75adf54bdc
commit 7e73bca0b7
5 changed files with 30 additions and 4 deletions
src/java.base/share/classes/java/lang
test/jdk/java/lang

@ -290,6 +290,12 @@ public class Runtime {
* behaves in exactly the same way as the invocation
* {@link #exec(String, String[], File) exec}{@code (command, null, null)}.
*
* @deprecated This method is error-prone and should not be used, the corresponding method
* {@link #exec(String[])} or {@link ProcessBuilder} should be used instead.
* The command string is broken into tokens using only whitespace characters.
* For an argument with an embedded space, such as a filename, this can cause problems
* as the token does not include the full filename.
*
* @param command a specified system command.
*
* @return A new {@link Process} object for managing the subprocess
@ -311,6 +317,7 @@ public class Runtime {
* @see #exec(String[], String[], File)
* @see ProcessBuilder
*/
@Deprecated(since="18")
public Process exec(String command) throws IOException {
return exec(command, null, null);
}
@ -324,6 +331,12 @@ public class Runtime {
* behaves in exactly the same way as the invocation
* {@link #exec(String, String[], File) exec}{@code (command, envp, null)}.
*
* @deprecated This method is error-prone and should not be used, the corresponding method
* {@link #exec(String[], String[])} or {@link ProcessBuilder} should be used instead.
* The command string is broken into tokens using only whitespace characters.
* For an argument with an embedded space, such as a filename, this can cause problems
* as the token does not include the full filename.
*
* @param command a specified system command.
*
* @param envp array of strings, each element of which
@ -352,6 +365,7 @@ public class Runtime {
* @see #exec(String[], String[], File)
* @see ProcessBuilder
*/
@Deprecated(since="18")
public Process exec(String command, String[] envp) throws IOException {
return exec(command, envp, null);
}
@ -374,6 +388,12 @@ public class Runtime {
* produced by the tokenizer are then placed in the new string
* array {@code cmdarray}, in the same order.
*
* @deprecated This method is error-prone and should not be used, the corresponding method
* {@link #exec(String[], String[], File)} or {@link ProcessBuilder} should be used instead.
* The command string is broken into tokens using only whitespace characters.
* For an argument with an embedded space, such as a filename, this can cause problems
* as the token does not include the full filename.
*
* @param command a specified system command.
*
* @param envp array of strings, each element of which
@ -406,6 +426,7 @@ public class Runtime {
* @see ProcessBuilder
* @since 1.3
*/
@Deprecated(since="18")
public Process exec(String command, String[] envp, File dir)
throws IOException {
if (command.isEmpty())

@ -49,17 +49,20 @@ public class Zombies {
final Runtime rt = Runtime.getRuntime();
try {
rt.exec("no-such-file");
String[] cmd = {"no-such-file"};
rt.exec(cmd);
throw new Error("expected IOException not thrown");
} catch (IOException expected) {/* OK */}
try {
rt.exec(".");
String[] cmd = {"."};
rt.exec(cmd);
throw new Error("expected IOException not thrown");
} catch (IOException expected) {/* OK */}
try {
rt.exec(TrueCommand, null, new File("no-such-dir"));
String[] cmd = {TrueCommand};
rt.exec(cmd, null, new File("no-such-dir"));
throw new Error("expected IOException not thrown");
} catch (IOException expected) {/* OK */}

@ -29,6 +29,7 @@
public class BadEnvp {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
Runtime r = Runtime.getRuntime();
java.io.File dir = new java.io.File(".");

@ -41,7 +41,7 @@ public class ExecWithDir {
}
UnixCommands.ensureCommandsAvailable("true");
final String trueCmd = UnixCommands.findCommand("true");
final String[] trueCmd = {UnixCommands.findCommand("true")};
File dir = new File(".");
for (int i = 1; i <= N; i++) {
System.out.print(i);

@ -62,6 +62,7 @@ public class SetCwd {
@Test
public void testRuntimeExecWithString() throws Exception {
String cmd = String.join(" ", CMD_ARRAY);
@SuppressWarnings("deprecation")
Process process = Runtime.getRuntime().exec(cmd, null,
new File(TEST_CLASSES));
verifyProcessOutput(process);