Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6857906

(process) ProcessBuilder cannot start a java.exe process with -D arguments

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Not an Issue
    • Icon: P4 P4
    • None
    • 6u13
    • core-libs
    • x86
    • windows_xp

      FULL PRODUCT VERSION :
      java version "1.6.0_13"
      Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
      Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows XP [Version 5.1.2600]

      A DESCRIPTION OF THE PROBLEM :
      The ProcessBuilder cannot run java.exe with -D arguments. Runtime.exec() works with the exact same command. The same command works from the DOS command line.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      See the code below.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
        Tomcat would stop (or start)
      ACTUAL -
      Get Exceptions about not being able to find a file or a class.

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      java.io.IOException: Cannot run program "C:\bin\Java\jdk1.6.0_13\jre\bin\java.exe -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="C:\dean\bin\apache-tomcat-5.5.27\conf\logging.properties" -Djava.endorsed.dirs="C:\dean\bin\apache-tomcat-5.5.27\common\endorsed" -Dcatalina.base="C:\dean\bin\apache-tomcat-5.5.27" -Dcatalina.home="C:\dean\bin\apache-tomcat-5.5.27" -Djava.io.tmpdir="C:\dean\bin\apache-tomcat-5.5.27\temp" -classpath "C:\bin\Java\jdk1.6.0_13\jre\lib\tools.jar;C:\dean\bin\apache-tomcat-5.5.27\bin\bootstrap.jar" org.apache.catalina.startup.Bootstrap": CreateProcess error=2, The system cannot find the file specified
      at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
      at TomcatUtil.stopTomcatProcessBuilder(TomcatUtil.java:147)
      at TomcatUtil.main(TomcatUtil.java:199)
      Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
      at java.lang.ProcessImpl.create(Native Method)
      at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
      at java.lang.ProcessImpl.start(ProcessImpl.java:30)
      at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
      ... 2 more


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------

      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStreamReader;
      import java.util.ArrayList;
      import java.util.List;

      public class TomcatUtil {

      public static String CATALINA_HOME = "CATALINA_HOME";
      public static String JAVA_HOME = "JAVA_HOME";
      String pathSeparator = System.getProperty("path.separator");
      String fileSeparator = System.getProperty("file.separator");
      String javaHome = System.getProperty("java.home");
      String catalinaHome = System.getenv(CATALINA_HOME);

      private String getJavaExe() {

      // String javaExe = javaHome + fileSeparator + "bin" + fileSeparator + "java.exe";
      // return javaExe;
      return javaHome + fileSeparator + "bin" + fileSeparator + "java.exe";
      }

      private String getTomcatEnvVarsAndClasspath() {
      StringBuilder sb = new StringBuilder();
      sb.append(" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager");
      sb.append(" -Djava.util.logging.config.file=\"" + catalinaHome + fileSeparator + "conf" + fileSeparator + "logging.properties\"");
      sb.append(" -Djava.endorsed.dirs=\"" + catalinaHome + fileSeparator + "common" + fileSeparator + "endorsed\"");
      sb.append(" -Dcatalina.base=\"" + catalinaHome + "\"");
      sb.append(" -Dcatalina.home=\"" + catalinaHome + "\"");
      sb.append(" -Djava.io.tmpdir=\"" + catalinaHome + fileSeparator + "temp\"");
      sb.append(" -classpath \"" + javaHome + fileSeparator + "lib" + fileSeparator + "tools.jar" + pathSeparator + catalinaHome + fileSeparator + "bin" + fileSeparator + "bootstrap.jar\"");
      return sb.toString();
      }

      private List<String> getTomcatEnvVarsAndClasspathAsList() {
      ArrayList<String> al = new ArrayList<String>();
      al.add(getJavaExe());
      al.add(" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager");
      al.add(" -Djava.util.logging.config.file=\"" + catalinaHome + fileSeparator + "conf" + fileSeparator + "logging.properties\"");
      al.add(" -Djava.endorsed.dirs=\"" + catalinaHome + fileSeparator + "common" + fileSeparator + "endorsed\"");
      al.add(" -Dcatalina.base=\"" + catalinaHome + "\"");
      al.add(" -Dcatalina.home=\"" + catalinaHome + "\"");
      al.add(" -Djava.io.tmpdir=\"" + catalinaHome + fileSeparator + "temp\"");
      al.add(" -classpath \"" + javaHome + fileSeparator + "lib" + fileSeparator + "tools.jar" + pathSeparator + catalinaHome + fileSeparator + "bin" + fileSeparator + "bootstrap.jar\"");
      return al;
      }

      private List<String> getTomcatEnvVarsAndClasspathAsList2() {
      ArrayList<String> al = new ArrayList<String>();
      al.add(getJavaExe());
      al.add(
      " -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +
      " -Djava.util.logging.config.file=\"" + catalinaHome + fileSeparator + "conf" + fileSeparator + "logging.properties\"" +
      " -Djava.endorsed.dirs=\"" + catalinaHome + fileSeparator + "common" + fileSeparator + "endorsed\"" +
      " -Dcatalina.base=\"" + catalinaHome + "\"" +
      " -Dcatalina.home=\"" + catalinaHome + "\"" +
      " -Djava.io.tmpdir=\"" + catalinaHome + fileSeparator + "temp\"" +
      " -classpath \"" + javaHome + fileSeparator + "lib" + fileSeparator + "tools.jar" + pathSeparator + catalinaHome + fileSeparator + "bin" + fileSeparator + "bootstrap.jar\"" +
      " org.apache.catalina.startup.Bootstrap stop");
      return al;
      }

      private List<String> getTomcatEnvVarsAndClasspathAsList3() {
      ArrayList<String> al = new ArrayList<String>();
      al.add(getJavaExe() +
      " -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +
      " -Djava.util.logging.config.file=\"" + catalinaHome + fileSeparator + "conf" + fileSeparator + "logging.properties\"" +
      " -Djava.endorsed.dirs=\"" + catalinaHome + fileSeparator + "common" + fileSeparator + "endorsed\"" +
      " -Dcatalina.base=\"" + catalinaHome + "\"" +
      " -Dcatalina.home=\"" + catalinaHome + "\"" +
      " -Djava.io.tmpdir=\"" + catalinaHome + fileSeparator + "temp\"");
      al.add(
      " -classpath \"" + javaHome + fileSeparator + "lib" + fileSeparator + "tools.jar" + pathSeparator + catalinaHome + fileSeparator + "bin" + fileSeparator + "bootstrap.jar\"" +
      " org.apache.catalina.startup.Bootstrap stop");
      return al;
      }

      private List<String> getTomcatEnvVarsAndClasspathAsList4() {
      ArrayList<String> al = new ArrayList<String>();
      al.add(getJavaExe() +
      " -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +
      " -Djava.util.logging.config.file=\"" + catalinaHome + fileSeparator + "conf" + fileSeparator + "logging.properties\"" +
      " -Djava.endorsed.dirs=\"" + catalinaHome + fileSeparator + "common" + fileSeparator + "endorsed\"" +
      " -Dcatalina.base=\"" + catalinaHome + "\"" +
      " -Dcatalina.home=\"" + catalinaHome + "\"" +
      " -Djava.io.tmpdir=\"" + catalinaHome + fileSeparator + "temp\"" +
      " -classpath \"" + javaHome + fileSeparator + "lib" + fileSeparator + "tools.jar" + pathSeparator + catalinaHome + fileSeparator + "bin" + fileSeparator + "bootstrap.jar\"");
      al.add(" org.apache.catalina.startup.Bootstrap stop");
      return al;
      }

      private List<String> getTomcatEnvVarsAndClasspathAsList5() {
      ArrayList<String> al = new ArrayList<String>();
      al.add(getJavaExe() +
      " -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +
      " -Djava.util.logging.config.file=\"" + catalinaHome + fileSeparator + "conf" + fileSeparator + "logging.properties\"" +
      " -Djava.endorsed.dirs=\"" + catalinaHome + fileSeparator + "common" + fileSeparator + "endorsed\"" +
      " -Dcatalina.base=\"" + catalinaHome + "\"" +
      " -Dcatalina.home=\"" + catalinaHome + "\"" +
      " -Djava.io.tmpdir=\"" + catalinaHome + fileSeparator + "temp\"" +
      " -classpath \"" + javaHome + fileSeparator + "lib" + fileSeparator + "tools.jar" + pathSeparator + catalinaHome + fileSeparator + "bin" + fileSeparator + "bootstrap.jar\"" +
      " org.apache.catalina.startup.Bootstrap");
      al.add(" stop");
      return al;
      }

      private void stopTomcat() {

      System.out.println("Stopping Tomcat");
      String javaExe = getJavaExe();
      String tomcatString = getTomcatEnvVarsAndClasspath();

      tomcatString += " org.apache.catalina.startup.Bootstrap stop";

      System.out.println(javaExe + tomcatString);

      try {

      Runtime.getRuntime().exec(javaExe + tomcatString);
      System.out.println("Tomcat stopped with Runtime.exec().");
      } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      }

      private void stopTomcatProcessBuilder() {

      System.out.println("Stopping Tomcat");
      // List<String> al = getTomcatEnvVarsAndClasspathAsList();
      // al.add("org.apache.catalina.startup.Bootstrap stop");
      // List<String> al = getTomcatEnvVarsAndClasspathAsList2();
      // List<String> al = getTomcatEnvVarsAndClasspathAsList3();
      // List<String> al = getTomcatEnvVarsAndClasspathAsList4();
      List<String> al = getTomcatEnvVarsAndClasspathAsList5();
      System.out.println(al);
      ProcessBuilder pb = new ProcessBuilder(al);
      System.out.println(pb.environment());
      pb.redirectErrorStream(true);
      Process p;
      try {
      p = pb.start();
      System.out.println("Process started.");
      BufferedReader br = new BufferedReader ( new InputStreamReader (p.getInputStream()) ) ;
      String line;
      while ((line = br.readLine())!= null )
      System.out.println ( line ) ;

      System.out.println("Tomcat stopped with ProcessBuilder.");
      } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      }

      private void startTomcat(boolean debug) {

      System.out.println("Starting Tomcat");
      String javaExe = getJavaExe();
      String tomcatString = getTomcatEnvVarsAndClasspath();

      if (debug)
      tomcatString += " -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n";

      tomcatString += " org.apache.catalina.startup.Bootstrap start";

      System.out.println(javaExe + tomcatString);

      try {
      // ProcessBuilder pb = new ProcessBuilder(javaExe, sb.toString());
      // Process p = pb.start();
      // System.out.println("Process " + p + " started.");

      Runtime.getRuntime().exec(javaExe + tomcatString);
      System.out.println("Tomcat started with Runtime.exec().");
      } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }

      }

      public static void main(String[] args) {

      TomcatUtil tu = new TomcatUtil();

      tu.startTomcat(true);
      try {
      Thread.sleep(5000);
      } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      tu.stopTomcatProcessBuilder();
      // tu.stopTomcat();

      try {
      Thread.sleep(5000);
      } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }

      tu.startTomcat(true);
      try {
      Thread.sleep(5000);
      } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      // tu.stopTomcatProcessBuilder();
      tu.stopTomcat();
      }

      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Runtime.exec() works properly.

            michaelm Michael McMahon
            ndcosta Nelson Dcosta (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: