0

Solaris ゾーンで複数のファイルをコンパイルするために javac を実行したいのですが、手動で実行できますが、以下のコードが機能しません。

try {
        File directory = new File(dir);
        ProcessBuilder builder = new ProcessBuilder(dirJava, allfiles);
        builder.directory(directory);
        builder.redirectErrorStream(true);
        Process process = builder.start();

        InputStreamReader isr = new  InputStreamReader(process.getInputStream());
        BufferedReader br = new BufferedReader(isr);
        String lineRead;
        while ((lineRead = br.readLine()) != null) {
            System.out.println("> "+lineRead);
        }
        process.waitFor();
    }
    catch (IOException e) {
        System.out.println("Could not convert files: "+e.getMessage());
    }

ProcessBuilder の作成で

dirJava = "/usr/jdk/instances/jdk1.6.0/bin/javac"

dir = "/opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/"

allfiles (以下の 15 個の完全なファイル パスの連結) =

"/opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/StringWrapper.java /opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/DistanceInstanceIterator.java. opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/StringDistance.java /opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/StringWrapperIterator.java /opt/ glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/Tokenizer.java /opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/Jaccard.java /opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/BasicToken.java /opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/BasicStringWrapper.java / opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/StringDistanceLearner.java /opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/DataTownMain.java /opt/ glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/BagOfTokens.java /opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/Token.java /opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/SimpleTokenizer.java /opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/AbstractStringDistance. opt/glassfish3/glassfish/domains/domain1/temp/1b504235dc6be0558532a7b7bf27/methods/String_Distance/u/DistanceInstance.java"

javac: file not found: /opt/glassfish3/glassfish/domains/...' のプロセス エラー (エラーには、15 個のファイルすべてのフル パスがここにリストされています)

しかし、コマンドプロンプトで「dir」ディレクトリに移動し、スペースを付けて「javac」と入力すると、ファイルからの15個のファイルパスが見つかりませんというエラーメッセージが表示されます(逐語的にコピーされます)コマンドは機能し、それらすべての.classファイルを生成します.java ファイルと同じディレクトリにあるファイル。(コードの allfiles および dir 変数に先頭または末尾のスペースがないことを確認しました)。

おそらく、「dir」の最後のディレクトリが実行時に sessionId に基づいて作成されるためだと思ったので、「dir」=「/opt/glassfish3/glassfish/domains/domain1/temp/」(実行前に存在します-時間)、それでも失敗しますが、手動でそのディレクトリに移動し、javac と 15 個のファイルの完全なパス名を入力するだけで機能します。何か案は?

4

1 に答える 1

0

わかりました、それで私は自分が犯していた単純な間違いを理解しました-複数のファイルパスを「allfiles」に連結してそれを単一の引数として渡す代わりに、各ファイルパスを独自の引数として ProcessBuilder に渡すか、すべての引数を次のように渡す必要があります配列。

于 2012-06-29T01:42:47.687 に答える