2

Runtime.getRuntime.exec(command)を使用していくつかのJavaファイルをコンパイルしようとし、コマンドを生成しています。以下のコードは、私が行っていることを示しています。

String command = "javac ";
    for(String s: this.getPackages())
    {
        command = command + "/home/benuni/CompileFiles/" + project + "/" + s + "/*.java ";
    }

    try {
        System.out.println("command: '"+ command +"'");
        Process pro = Runtime.getRuntime().exec(command);
         printLines(" stderr:", pro.getErrorStream());

        pro.waitFor();

これにより、次の出力が得られます。

command: 'javac /home/benuni/CompileFiles/HelloWorldProject/HelloWorldPackage/*.java '
stderr: javac: file not found:     /home/benuni/CompileFiles/HelloWorldProject/HelloWorldPackage/*.java
 stderr: Usage: javac <options> <source files>
 stderr: use -help for a list of possible options

そしてそれは機能しません..しかし、コマンドをシェルにコピーすると、問題なく機能します...何かアイデアはありますか?

4

3 に答える 3

4

*Javaはワイルドカードを拡張しません。それはシェルの機能です。代わりに、含まれているすべてのファイルを取得するためにディレクトリを一覧表示する必要があります。

このような何かがあなたのコマンドを構築するためのトリックをするでしょう:

    File[] files = new File("/home/benuni/CompileFiles/" + project + "/" + s).listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".java");
        }
    });

    StringBuilder command = new StringBuilder("javac");
    for(File file : files) {
        command.append(" ").append(file.getAbsolutePath());
    }
于 2012-08-23T21:51:36.267 に答える
2

コマンドラインから入力すると、コマンドアナライザー*がファイルのリストに展開されます。Runtime.execを使用する場合、その拡張は発生せず、リスト全体を明示的に指定する必要があります。

于 2012-08-23T21:51:37.670 に答える
1

1つのオプションは、ファイル名の実際のリストをjavacに提供することです。もう1つは、コマンドを使用してシェルに実行させることです。

/bin/sh -c javac /home/benuni/CompileFiles/HelloWorldProject/HelloWorldPackage/*.java 
于 2012-08-23T21:55:23.097 に答える