2017-04-02 71 views
0

首先,我搜索了論壇和網絡5個小時,但找不到我的問題是什麼,所以我希望這不是重複的。javac:在ProcessBuilder中找不到文件。命令在ProcessBuilder參數中分開

我正在使用Java ProcessBuilder編譯和運行Java項目。當我鍵入

javac /Users/Katzenmeister/Desktop/Final/src/edu/kit/informatik/citationmanager/*.java 

我MacOSX上的終端,我可以編譯整個文件夾中沒有任何錯誤。

在我的計劃,我有以下

public class CompilerController { 

private static File directory; 
private static String mainClass; 
private static boolean compiled = false; 

public static void setDirectory(File directory) { 
    CompilerController.directory = directory; 
} 

public static void setMainClass(String mainClass) { 
    CompilerController.mainClass = mainClass; 
} 

private static void compile() { 
    ProcessBuilder pb = new ProcessBuilder("javac",directory.getAbsolutePath()+"/*.java"); 
    pb.inheritIO(); 
    try { 
     pb.start(); 
     compiled = true; 
    } catch (IOException ex) { 
     System.out.println(ex); 
    } 
} 

private static String[] getSourcePath() { 

    String[] strArr = directory.toString().split("src"); 

    strArr[0] += "src"; 
    strArr[1] += mainClass; 

    return strArr; 
} 

private static void run() { 

    ProcessBuilder pb = new ProcessBuilder("java",getSourcePath()[0],getSourcePath()[1]); 
    try { 
     pb.start(); 
    } catch(IOException ex) { 
     System.out.println(ex); 
    } 

} 

public static void compileRun() { 
    compile(); 
    if (compiled) { 
     run(); 
    } 
} 
} 

在我的JavaFX控制器I類使用DirectoryChooser和使用setDirectory傳遞絕對路徑CompilerController取得相應目錄()。

當我運行我的程序,我得到以下錯誤:

javac: file not found: /Users/Katzenmeister/Desktop/Final/src/edu/kit/informatik/citationmanager/*.java 
Usage: javac <options> <source files> 
use -help for a list of possible options 

這是據我可以告訴我在我的終端工作同樣的事情。我現在只編寫了6個月,所以我缺乏知識,但我認爲這是由於JVM運行時目錄可能導致的。任何幫助是非常受歡迎的。這裏有一些我已經檢查了參考論壇鏈接:

ProcessBuilder can't find file?!

Run a .java file using ProcessBuilder

How to run a Java program using ProcessBuilder inside the other Java program. (with -cp and -Xbootclasspath commands)

Compile and Run Java Program from another Java Program

ProcessBuilder can't find file?!

PS:這是我第一次在論壇上提問。我盡我所能去適應禮儀,如果我做錯了任何事情,請告訴我,這樣我可以編輯我的問題。

編輯:我得到的代碼工作的人如下誰可能有類似的問題

private static void compile() { 

    ArrayList<String> files = new ArrayList<>(); 
    files.add("javac"); 
    files.add("-sourcepath"); 
    files.add("./*"); 

    try { 
     for (File file : directory.listFiles()) { 
      if (!file.isHidden()) { 
       files.add(file.getName()); 
      } 
     } 
    } catch(NullPointerException ex) {} 

    pb.directory(new File(directory.getAbsolutePath())); 
    pb.command(files); 
    pb.inheritIO(); 

    try { 
     synchronized (processLock) { 
      Process pr = pb.start(); 
      int i = pr.waitFor(); 
     } 
     compiled = true; 
    } catch (IOException ex) { 
     System.out.println(ex); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

回答

0

*進行不同的處理的外殼VS在ProcessBuilder:它被傳遞給javac在之前擴大shell,但它在字面上通過ProcessBuilder命令傳遞。

你可以看到這一點,如果你在shell命令前加echo

echo javac /Users/whatever/*.java 

會打印出像:

javac /Users/whatever/Foo.java /Users/whatever/Bar.java 

當你調用ProcessBuilder這樣,你正在做的相當於在shell中單引號的路徑,如下所示:

javac '/Users/whatever/*.java' 

從而抑制水珠擴張,使javac接收/Users/whatever/*.java,你可以看到,如果你添加echo到前面:

echo javac '/Users/whatever/*.java' 

打印

javac /Users/whatever/*.java 

你需要自己擴展的水珠,例如使用new File("/your/directory").listFiles(),並明確地將所有文件傳遞給ProcessBuilder

+0

非常感謝我現在正在嘗試併發布結果 – Katzenmeister

+0

我試過了你的建議,現在編譯器正在看到java文件。但是現在問題是這些類之間的依賴關係並沒有被找到,因爲我正在編譯每個類。例如,Foo類有一個ArrayList ,並且由於Foo和Bar是獨立編譯的,所以Foo的編譯失敗。我怎樣才能克服這個問題? – Katzenmeister

+0

如果您希望命令以相同的方式執行,則它們必須在相同的環境中執行,例如,相同的環境變量,相同的當前目錄等 –

相關問題