Skip to content

Commit

Permalink
8276408: Deprecate Runtime.exec methods with a single string command …
Browse files Browse the repository at this point in the history
…line argument

Reviewed-by: alanb
  • Loading branch information
Roger Riggs committed Nov 8, 2021
1 parent 75adf54 commit 7e73bca
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 4 deletions.
21 changes: 21 additions & 0 deletions src/java.base/share/classes/java/lang/Runtime.java
Expand Up @@ -290,6 +290,12 @@ public void halt(int status) {
* 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
Expand All @@ -311,6 +317,7 @@ public void halt(int status) {
* @see #exec(String[], String[], File)
* @see ProcessBuilder
*/
@Deprecated(since="18")
public Process exec(String command) throws IOException {
return exec(command, null, null);
}
Expand All @@ -324,6 +331,12 @@ public Process exec(String command) throws IOException {
* 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
Expand Down Expand Up @@ -352,6 +365,7 @@ public Process exec(String command) throws IOException {
* @see #exec(String[], String[], File)
* @see ProcessBuilder
*/
@Deprecated(since="18")
public Process exec(String command, String[] envp) throws IOException {
return exec(command, envp, null);
}
Expand All @@ -374,6 +388,12 @@ public Process exec(String command, String[] envp) throws IOException {
* 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
Expand Down Expand Up @@ -406,6 +426,7 @@ public Process exec(String command, String[] envp) throws IOException {
* @see ProcessBuilder
* @since 1.3
*/
@Deprecated(since="18")
public Process exec(String command, String[] envp, File dir)
throws IOException {
if (command.isEmpty())
Expand Down
9 changes: 6 additions & 3 deletions test/jdk/java/lang/ProcessBuilder/Zombies.java
Expand Up @@ -49,17 +49,20 @@ public static void main(String[] args) throws Throwable {
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 */}

Expand Down
1 change: 1 addition & 0 deletions test/jdk/java/lang/RuntimeTests/exec/BadEnvp.java
Expand Up @@ -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(".");
Expand Down
2 changes: 1 addition & 1 deletion test/jdk/java/lang/RuntimeTests/exec/ExecWithDir.java
Expand Up @@ -41,7 +41,7 @@ public static void main(String args[]) throws Exception {
}
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);
Expand Down
1 change: 1 addition & 0 deletions test/jdk/java/lang/RuntimeTests/exec/SetCwd.java
Expand Up @@ -62,6 +62,7 @@ public void testRuntimeExecWithArray() throws Exception {
@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);
Expand Down

1 comment on commit 7e73bca

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.