@ -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 }