用Java中的参数打开exe,不了解参数

时间:2013-06-04 04:46:57

标签: java processbuilder

我知道如何在线查找答案,用Java中的参数打开exe程序。但是我的具体捷径对我来说有点复杂。

我正在尝试打开一个具有以下目标的快捷方式:

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

在我的程序中,我将分割位置和我认为的参数分开。但是,当我运行程序时,我收到错误'Could not create Java Virtual Machine, Program will Exit'。能够更好地了解最新情况的人是否可以解释我可能做错了什么或者指出了我可以阅读的方向?

    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);
    }

1 个答案:

答案 0 :(得分:6)

传递给String的每个ProcessBuilder都是一个单独的参数(第一个参数除外,这是命令)。

将其视为传递给main方法的args[]。每个String都是数组中的一个单独元素。

我怀疑p1被解释为单个参数,当它实际上应该是两个......

尝试将此参数分成两个单独的参数

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";

<强>修订

查看-cp参数,看起来类路径元素是相对于执行命令的位置。这表明您需要使用ProcessBuilder#directory(File)来指定命令应该执行的位置。

例如,如果您的程序安装在C:\Program Files\MyAwesomeApp中,但是您从C:\Desktop的上下文中运行它,那么Java将无法找到它所需的Jar文件,通常会提高ClassNotFound例外。

相反,您需要告诉ProcessBuilder您希望命令在C:\Program Files\MyAwesomeApp上下文中执行。

例如......

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

从运行示例

更新

只是为了说明问题。我自己构建了一个简单的Java程序,简单地将一条简单的消息打印到标准中。

当我运行它时,它按预期工作......

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);
}

当我从

更改参数时
"-cp",
"C:\\...\\TestSimpleProcessBuilder\\build\\classes",

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

它失败了......

enter image description here

输出

  

无法识别的选项:-cp   C:\ DevWork \个人\ java中\项目\ WIP \ StackOverflow的\ TestSimpleProcessBuilder \建立\类

如果你想知道,这是我编写的小测试程序,可以运行......

package testsimpleprocessbuilder;

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

现在也许有人可以向我解释投票结果的原因?