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
This commit is contained in:
parent
9882d87e1b
commit
3adced9962
|
@ -16,16 +16,10 @@
|
||||||
|
|
||||||
package org.springframework.boot.loader.tools;
|
package org.springframework.boot.loader.tools;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
import org.springframework.util.ReflectionUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility used to run a process.
|
* Utility used to run a process.
|
||||||
|
@ -38,9 +32,6 @@ import org.springframework.util.ReflectionUtils;
|
||||||
*/
|
*/
|
||||||
public class RunProcess {
|
public class RunProcess {
|
||||||
|
|
||||||
private static final Method INHERIT_IO_METHOD = ReflectionUtils
|
|
||||||
.findMethod(ProcessBuilder.class, "inheritIO");
|
|
||||||
|
|
||||||
private static final long JUST_ENDED_LIMIT = 500;
|
private static final long JUST_ENDED_LIMIT = 500;
|
||||||
|
|
||||||
private File workingDirectory;
|
private File workingDirectory;
|
||||||
|
@ -81,13 +72,10 @@ public class RunProcess {
|
||||||
builder.directory(this.workingDirectory);
|
builder.directory(this.workingDirectory);
|
||||||
builder.command().addAll(args);
|
builder.command().addAll(args);
|
||||||
builder.redirectErrorStream(true);
|
builder.redirectErrorStream(true);
|
||||||
boolean inheritedIO = inheritIO(builder);
|
builder.inheritIO();
|
||||||
try {
|
try {
|
||||||
Process process = builder.start();
|
Process process = builder.start();
|
||||||
this.process = process;
|
this.process = process;
|
||||||
if (!inheritedIO) {
|
|
||||||
redirectOutput(process);
|
|
||||||
}
|
|
||||||
SignalUtils.attachSignalHandler(this::handleSigInt);
|
SignalUtils.attachSignalHandler(this::handleSigInt);
|
||||||
if (waitForProcess) {
|
if (waitForProcess) {
|
||||||
try {
|
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 running process.
|
||||||
* @return the process or {@code null}
|
* @return the process or {@code null}
|
||||||
|
|
Loading…
Reference in New Issue