0

Java プログラムを介して単純な ant -v コマンドを実行したいと考えています。検索した結果、ant は実際には exe 形式ではないため、process ではなく shell execute を使用する必要があることがわかりました。単純な JAVAC コマンドを実行するプログラムがありますが、ant が機能しません。私のコードは次のようになります。

Runtime runtime = Runtime.getRuntime() ;  
Process shellProcess = runtime.exec("D:\\installs\\apache-ant-1.9.2\\bin\\ant -v") ;
shellProcess.waitFor() ;

これを実行すると、次の例外が発生します

Exception in thread "main" java.io.IOException: Cannot run program "D:\installs\apache-ant-1.9.2\bin\ant": CreateProcess error=193, %1 is not a valid Win32 application
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
at java.lang.Runtime.exec(Runtime.java:615)
at java.lang.Runtime.exec(Runtime.java:448)
at java.lang.Runtime.exec(Runtime.java:345)
at com.check.SystemCheck.main(SystemCheck.java:14)
Caused by: java.io.IOException: CreateProcess error=193, %1 is not a valid Win32 application

パス全体を指定する理由は、指定しないとファイルが見つからないというエラーが発生するためです。これを機能させる方法について何か考えはありますか??

4

6 に答える 6

3

いくつものことが飛び出します。

  1. antコマンドはant.batウィンドウの下にある必要があります
  2. 各引数が個別の を表すように、コマンドを引数から分離する必要がありますString。これにより、スペースを含む引数の複雑さが大幅に軽減されます。たとえば...
  3. 本当に使用する必要があります。使用ProcessBuilderの複雑さが軽減されますProcess

例えば...

ProcessBuilder pb = new ProcessBuilder(
    "D:\\installs\\apache-ant-1.9.2\\bin\\ant.bat", 
    "-v");
pb.redirectError();
// This should point to where your build.xml file is...
pb.directory(new File("C:/"));
try {
    Process p = pb.start();
    InputStream is = p.getInputStream();
    int in = -1;
    while ((in = is.read()) != -1) {
        System.out.print((char) in);
    }
    int exitValue = p.waitFor();
    System.out.println("Exited with " + exitValue);
} catch (Exception ex) {
    ex.printStackTrace();
}

またant、これは linux/unix シェル スクリプトであり、Windows はこれをどう処理すればよいかわかりません ;)

更新しました

Windows 7 と Java 7 を使用してこれをテストしましたが、問題なく動作します。

Windows 7 と Java 6 を使用してこれをテストしましたが、問題なく動作します...

直接実行しても引き続き問題が発生する場合ant.batは、コマンド プロセッサ経由でバッチ ファイルを実行する必要があります。

ProcessBuilder pb = new ProcessBuilder(
    "cmd",
    "/c",
    "D:\\installs\\apache-ant-1.9.2\\bin\\ant.bat", 
    "-v");
于 2013-08-23T06:14:26.173 に答える
0

試す

ArrayList<String> argList = new ArrayList<String>();
argList.add("-v");
String[] args = argList.toArray(new String[argList.size()]);
Runtime.getRuntime().exec("D:\\installs\\apache-ant-1.9.2\\bin\\ant", args);

次のこともできます

ProcessBuilder pb = new ProcessBuilder("D:\\installs\\apache-ant-1.9.2\\bin\\ant -v", "-v");
Process p = pb.start();
于 2013-08-23T06:11:06.873 に答える
0

アニケットの答えに加えて、物事をさらに簡単にするために:

Runtime.getRuntime().exec("D:\\installs\\apache-ant-1.9.2\\bin\\ant", new String[]{"-v"});
于 2013-08-23T06:15:02.577 に答える
0

実行可能ファイルへのパラメーターは、個別に渡す必要があります。

Runtime.getRuntime().exec("D:\\installs\\apache-ant-1.9.2\\bin\\ant", "-v");

あなたの試みでは、実行可能ファイルは文字どおりですant -v(つまり、ファイル名にスペースがあり、ダッシュ v で終わります)。

于 2013-08-23T06:15:07.437 に答える