javaprocessbuilder

Opening exe with parameters in Java, don't understand parameters


I'm aware how to open an exe program with parameters in Java from finding the answer online. However my specific shortcut is a bit complicated for me to understand.

I'm trying to open a shortcut which has the following target:

C:\Windows\System32\javaw.exe -cp jts.jar;total.2012.jar -Dsun.java2d.noddraw=true -Dswing.boldMetal=false -Dsun.locale.formatasdefault=true -Xmx768M -XX:MaxPermSize=128M jclient/LoginFrame C:\Jts

In my program I've split up the location and what I think are the parameters. However when I run the program I get the error 'Could not create Java Virtual Machine, Program will Exit'. Can someone with a better understanding of whats going on explain what I might be doing wrong or point me in a direction where I can read up?

    String location = "C:\\Windows\\System32\\javaw.exe";
    String p1="-cp jts.jar;total.2012.jar"; 
    String p2="-Dsun.java2d.noddraw=true";
    String p3="-Dswing.boldMetal=false";
    String p4="-Dsun.locale.formatasdefault=true";
    String p5="-Xmx768M";
    String p6="-XX:MaxPermSize=128M";
    String p7="jclient/LoginFrame" ;
    String p8 = "C:\\Jts";

try {
        Process p = new ProcessBuilder(location,p1,p2,p3,p4,p5,p6,p7,p8).start();
    } catch (IOException ex) {
        Logger.getLogger(Openprogramtest.class.getName()).log(Level.SEVERE, null, ex);
    }

Solution

  • Each String you pass to ProcessBuilder is a separate argument (except the first one, which is the command).

    Think of it like the args[] which are passed to your main method. Each String would be a separate element in the array.

    I suspect that p1 is been interpreted as a single argument, when it should actually be two...

    Try separating this argument into two separate parameters

    String location = "C:\\Windows\\System32\\javaw.exe";
    String p1="-cp"; 
    String p2="jts.jar;total.2012.jar"; 
    String p3="-Dsun.java2d.noddraw=true";
    String p4="-Dswing.boldMetal=false";
    String p5="-Dsun.locale.formatasdefault=true";
    String p6="-Xmx768M";
    String p7="-XX:MaxPermSize=128M";
    String p8="jclient/LoginFrame" ;
    String p9 = "C:\\Jts";
    

    Amendment

    Look at the -cp parameter, it appears that the class path elements are relative to the location that the command is executed. This suggests that you need to use the ProcessBuilder#directory(File) to specify the location that the command should executed from.

    For example, if you program is installed in C:\Program Files\MyAwesomeApp, but you run it from the context of C:\Desktop, then Java won't be able to find the Jar files it needs, generally raising a ClassNotFound exception.

    Instead, you need to tell ProcessBuilder that you want the command to executed from within the C:\Program Files\MyAwesomeApp context.

    For example...

    ProcessBuilder pb = new ProcessBuilder(...);
    pb.directory(new File("C:\Program Files\MyAwesomeApp"));
    // Other settings...
    Process p = pb.start();
    

    Updated from running example

    Just to make the point. I built myself a little Java program that simple printed a simple message to the standard out.

    When I run this, it works as expected...

    try {
        String params[] = new String[]{
            "C:\\Windows\\System32\\javaw.exe",
            "-cp",
            "C:\\...\\TestSimpleProcessBuilder\\build\\classes",
            "-Dsun.java2d.noddraw=true",
            "-Dswing.boldMetal=false",
            "-Dsun.locale.formatasdefault=true",
            "-Xmx768M",
            "-XX:MaxPermSize=128M",
            "testsimpleprocessbuilder/HelloWorld",
            "Boo"
        };
        ProcessBuilder pb = new ProcessBuilder(params);
        pb.redirectErrorStream();
        Process p = pb.start();
        InputStream is = p.getInputStream();
        int in = -1;
        while ((in = is.read()) != -1) {
            System.out.print((char) in);
        }
        is = p.getErrorStream();
        in = -1;
        while ((in = is.read()) != -1) {
            System.out.print((char) in);
        }
        System.out.println("p exited with " + p.exitValue());
    } catch (IOException ex) {
        Logger.getLogger(TestSimpleProcessBuilder.class.getName()).log(Level.SEVERE, null, ex);
    }
    

    When I change the arguments from

    "-cp",
    "C:\\...\\TestSimpleProcessBuilder\\build\\classes",
    

    to

    "-cp C:\\...\\TestSimpleProcessBuilder\\build\\classes",
    

    It fails with...

    enter image description here

    And outputs

    Unrecognized option: -cp C:\DevWork\personal\java\projects\wip\StackOverflow\TestSimpleProcessBuilder\build\classes

    And if you're wondering, this is the little test program I wrote that gets run...

    package testsimpleprocessbuilder;
    
    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println("Hello world - world says " + (args.length > 0 ? args[0] : "Nothing"));
        }
    }