2012-08-23 111 views
2

我試圖編譯一些java文件使用Runtime.getRuntime.exec(命令)和im生成命令。下面的代碼顯示我在做什麼:Java Runtime執行與命令行不同的內部程序嗎?

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 

和它不工作..但如果我複製命令到我的殼,它的工作原理沒有問題... 有任何想法嗎?

+0

試着用任何一個文件是在/ home/benuni/CompileFiles/HelloWorldProject/HelloWorldPackage/ –

回答

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()); 
    } 
+0

感謝v多少工作完全取代*的.java! –

2

當你在命令行輸入,命令分析器擴展到*文件列表。當您使用Runtime.exec擴展沒有發生,並且您必須顯式指定整個列表。

1

一個選項是提供文件名的實際列表到javac。另一種方法是讓殼做的,使​​用命令