web-dev-qa-db-ja.com

コマンドの作業ディレクトリをjava

Javaプロジェクトにあるパッケージの1つにある関数から、.exeファイルを実行する必要があります。これで、作業ディレクトリはJavaしかし、私のプロジェクトのサブディレクトリにある.exeファイル。プロジェクトの編成方法は次のとおりです。

ROOT_DIR
|.......->com
|         |......->somepackage
|                 |.........->callerClass.Java
|
|.......->resource
         |........->external.exe

最初は、次の方法で.exeファイルを直接実行しようとしました。

String command = "resources\\external.exe  -i input -o putpot";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);

しかし、問題は、外部.exeが独自のディレクトリ内のいくつかのファイルにアクセスする必要があり、ルートディレクトリがそのディレクトリであると考え続けることです。問題を解決するために.batファイルを使用しようとしましたが、同じ問題が発生します。

Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "resources\\helper.bat"});

.batファイルは.exeファイルと同じディレクトリにありますが、同じ問題が発生します。 .batファイルの内容は次のとおりです。

@echo off
echo starting process...

external.exe -i input -o output

pause

.batファイルをrootに移動してその内容を修正しても、問題は解決しません。 plz plzplzヘルプ

18
user804723

これを実装するには、ProcessBuilderクラスを使用できます。次のようになります。

File pathToExecutable = new File( "resources/external.exe" );
ProcessBuilder builder = new ProcessBuilder( pathToExecutable.getAbsolutePath(), "-i", "input", "-o", "output");
builder.directory( new File( "resources" ).getAbsoluteFile() ); // this is where you set the root folder for the executable to run with
builder.redirectErrorStream(true);
Process process =  builder.start();

Scanner s = new Scanner(process.getInputStream());
StringBuilder text = new StringBuilder();
while (s.hasNextLine()) {
  text.append(s.nextLine());
  text.append("\n");
}
s.close();

int result = process.waitFor();

System.out.printf( "Process exited with result %d and output %s%n", result, text );

これはかなりの数のコードですが、プロセスの実行方法をさらに細かく制御できます。

24

この形式のexecメソッド を使用して、作業ディレクトリを指定します

public Process exec(String[] cmdarray,
                    String[] envp,
                    File dir)
             throws IOException

作業ディレクトリは3番目の引数です。特別な環境を設定する必要がない場合は、nullenvpを渡すことができます。

この便利な方法 :もあります

public Process exec(String command,
                    String[] envp,
                    File dir)
             throws IOException

...コマンドを1つの文字列で指定します(コマンドは配列に変換されるだけです。詳細については、ドキュメントを参照してください)。

16
Ray Tayek

プロジェクトで同じ問題が発生しました。ProcessBuilder.directory(myDir)Runtimeのexecメソッドについてこの解決策を試しましたが、すべてのトレイが失敗しました。
Runtimeには、作業ディレクトリとそのサブディレクトリに対してのみ制限された権限があることがわかりました。

だから私の解決策は醜いですが、非常にうまく機能しています。
作業ディレクトリの「ランタイム」に一時的な.batファイルを作成します。
このファイルには、2行のコマンドが含まれていました。
1。必要なディレクトリに移動します(cdコマンド)。
2。必要なコマンドを実行します。
一時的な.batファイルをコマンドとして使用してRuntimeからexecを呼び出します。
それは私にとって非常にうまくいきました!

0
David Hazani