【问题标题】:Opening exe with parameters in Java, don't understand parametersJava中带参数打开exe,不懂参数
【发布时间】:2013-06-04 04:46:57
【问题描述】:

我知道如何通过在线查找答案来打开带有 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);
    }

【问题讨论】:

  • 手动运行快捷方式是否有效?
  • 尝试通过仅指定location 参数来运行Process。如果可行,则表示参数中存在一些错误
  • @Blorgbeard 是的。这是我安装的一个被广泛使用的程序。 Extreme Coders,如果我不带参数运行它,它只会运行 java
  • 在调用start()之前尝试在ProcessBuilder上设置工作目录
  • 每个参数都应该单独过去,我怀疑p1没有被正确解释。 "-cp jts.jar;total.2012.jar" 在字面上被视为单个参数,请尝试拆分,以便 -cpjts.jar;total.2012.jar 作为单个参数过去

标签: java processbuilder


【解决方案1】:

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

把它想象成传递给你的主要方法的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",

它失败了...

并输出

无法识别的选项:-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"));
    }
}

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

【讨论】:

  • 必须喜欢没有 cmets 的投票。想就为什么这可能不是一个合适的答案发表评论吗?也许给海报一个自我救赎的机会?
  • 下午好,不知道谁投了反对票,但不是我。今天回家后,我会仔细检查这个答案并进行测试。我知道昨天当我按照你的要求拆分 -cp 部分时,我没有收到错误,但程序也没有打开。正如前面的cmets 中提到的,程序没有在命令行中打开,所以现在我想我可能有正确的参数,只是要弄清楚为什么它没有从命令行打开,而是从double 打开单击快捷方式 .lnk。也绝对感谢您的帮助,只是想让您知道我没有对您投反对票。
  • @Chowza 至少我们解决了部分问题。在我看来,类路径似乎与执行程序的位置有关。这建议您我需要调用 Process#directory(File) 将工作目录设置到安装程序的相同位置
  • @Chowza 我添加了一个修改来填写之前的评论
  • 在我发现我的问题时添加评论。我需要将我的 processbuilder 上的目录更改为 c:/Jts 以防其他人想弄清楚这一点。
猜你喜欢
  • 2016-02-05
  • 1970-01-01
  • 2011-10-23
  • 2014-04-10
  • 1970-01-01
  • 2014-08-20
  • 2018-12-31
  • 1970-01-01
  • 2012-05-10
相关资源
最近更新 更多