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

它不工作..但是如果我将命令复制到我的shell中,它就没有问题......有什么想法吗?

4

3 回答 3

4

Java 不会*为您扩展通配符。那是shell的一个功能。相反,您需要列出目录以获取所有包含的文件。

像这样的东西可以构建你的命令:

    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

一种选择是向 javac 提供文件名的实际列表。另一种是让shell来做,使用命令

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