Remove workaround for JDK-8023130 in RunProcess

With JDK 8 being the baseline and JDK 7 not being supported anymore we
can get rid of the workaround for a JDK 7 bug in
ProcessBuilder.inheritIO on Windows machines.

Closes gh-12337
pull/12337/merge
dreis2211 7 years ago committed by Andy Wilkinson
parent 9882d87e1b
commit 3adced9962

@ -16,16 +16,10 @@
package org.springframework.boot.loader.tools;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
import java.util.Locale;
import org.springframework.util.ReflectionUtils;
/**
* Utility used to run a process.
@ -38,9 +32,6 @@ import org.springframework.util.ReflectionUtils;
*/
public class RunProcess {
private static final Method INHERIT_IO_METHOD = ReflectionUtils
.findMethod(ProcessBuilder.class, "inheritIO");
private static final long JUST_ENDED_LIMIT = 500;
private File workingDirectory;
@ -81,13 +72,10 @@ public class RunProcess {
builder.directory(this.workingDirectory);
builder.command().addAll(args);
builder.redirectErrorStream(true);
boolean inheritedIO = inheritIO(builder);
builder.inheritIO();
try {
Process process = builder.start();
this.process = process;
if (!inheritedIO) {
redirectOutput(process);
}
SignalUtils.attachSignalHandler(this::handleSigInt);
if (waitForProcess) {
try {
@ -108,61 +96,6 @@ public class RunProcess {
}
}
private boolean inheritIO(ProcessBuilder builder) {
if (isInheritIOBroken()) {
return false;
}
try {
INHERIT_IO_METHOD.invoke(builder);
return true;
}
catch (Exception ex) {
return false;
}
}
// There's a bug in the Windows VM (https://bugs.openjdk.java.net/browse/JDK-8023130)
// that means we need to avoid inheritIO
private static boolean isInheritIOBroken() {
if (!System.getProperty("os.name", "none").toLowerCase(Locale.ENGLISH)
.contains("windows")) {
return false;
}
String runtime = System.getProperty("java.runtime.version");
if (!runtime.startsWith("1.7")) {
return false;
}
String[] tokens = runtime.split("_");
if (tokens.length < 2) {
return true; // No idea actually, shouldn't happen
}
try {
Integer build = Integer.valueOf(tokens[1].split("[^0-9]")[0]);
if (build < 60) {
return true;
}
}
catch (Exception ex) {
return true;
}
return false;
}
private void redirectOutput(Process process) {
new Thread(() -> {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
reader.lines().forEach((line) -> {
System.out.println(line);
System.out.flush();
});
}
catch (Exception ex) {
// Ignore
}
}).start();
}
/**
* Return the running process.
* @return the process or {@code null}

Loading…
Cancel
Save