Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java中的参数打开exe,don';我不懂参数_Java_Processbuilder - Fatal编程技术网

使用Java中的参数打开exe,don';我不懂参数

使用Java中的参数打开exe,don';我不懂参数,java,processbuilder,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/LoginF

我知道如何在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

在我的程序中,我划分了位置和我认为是参数。然而,当我运行程序时,我得到错误“无法创建Java虚拟机,程序将退出”。有人能更好地理解正在发生的事情,解释一下我可能做错了什么,或者给我指出一个可以阅读的方向吗

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

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

把它想象成传递给main方法的
args[]
。每个
字符串都是数组中的一个单独元素

我怀疑
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
参数,类路径元素似乎与执行命令的位置有关。这表明您需要使用指定执行命令的位置

例如,如果程序安装在
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:\DevWork\personal\java\projects\wip\StackOverflow\TestSimpleProcessBuilder\build\classes

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

package testsimpleprocessbuilder;

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

现在,也许有人可以向我解释否决票的原因?

手动运行快捷方式是否有效?请尝试仅通过指定
位置
参数来运行
过程。如果这是可行的,那就意味着数据中存在一些错误parameters@Blorgbeard是的。这是我安装的一个广泛使用的程序。极端的程序员,如果我在没有参数的情况下运行它,它只是在运行javaTry设置
ProcessBuilder
上的工作目录,然后调用
start()
每个参数都应该单独过去,我怀疑
p1
没有被正确解释
“-cp jts.jar;total.2012.jar”
被视为一个单独的参数,请尝试拆分
-cp
jts.jar;total.2012.jar
已作为单个参数过期。Otta love down投票无需注释。想就为什么这可能不是一个合适的答案发表评论吗?也许给一张海报一个赎罪的机会?下午好,不知道谁投了反对票,但不是我。今天到家后,我会再次检查这个答案,然后测试它。我知道昨天当我按照你的要求拆分-cp部分时,我没有收到错误,但是程序也没有打开。如前所述,程序不会在命令行中打开,所以现在我想我可能有正确的参数,只是要弄清楚为什么它不会从命令行打开,而是通过双击快捷方式.lnk打开。当然也非常感谢你的帮助,只是想让你知道我没有投你反对票。@Chowza至少我们解决了部分问题。在我看来,类路径似乎与执行程序的位置有关。这将建议您需要调用以将工作目录设置为程序所在的相同位置installed@Chowza我添加了一个修正案来填写前面的评论,在我解决问题时添加了一条评论。我需要将processbuilder上的目录更改为c:/Jts,以防其他人想弄明白这一点。
package testsimpleprocessbuilder;

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