2012-08-02 60 views
0

我想編寫Java代碼運行wget來從服務器呼叫終端中使用Java(OSX)命令

我相信我已經wget的正確安裝檢索圖像。如果我輸入:

wget http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe 

我在我的用戶帳戶文件夾中找到圖像。

下面的Java代碼是在Ubuntu上正常工作,但我不得不在移動項目OSX(山獅)

import java.io.*; 
import java.io.IOException; 

public class runWget 
{ 

    public static void main (String args[]) 
    { 
    String whatToRun = "wget  http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe"; 
    try 
    { 
    Runtime rt = Runtime.getRuntime(); 
    Process proc = rt.exec(whatToRun); 
    int exitVal = proc.waitFor(); 
    System.out.println("Process exitValue:" + exitVal); 
    } catch (Throwable t) 
    { 
     t.printStackTrace(); 
    } 
    } 
} 

當我試圖在OSX上運行它,我得到的運行時錯誤:

java.io.IOException: Cannot run program "wget": error=2, No such file or directory

如果有人能告訴我我做錯了什麼,我將不勝感激。

+0

我建議你安裝[自制](http://mxcl.github.com/homebrew/) 。然後你可以在終端上輸入'brew install wget',並安裝wget。來自Ubuntu,這對你來說非常直觀。 – Hassan 2012-08-02 19:17:29

+0

他們說他們已經安裝了'wget'。打開一個終端並鍵入'which wget'。這應該告訴你它是否在那裏。 – davidfmatheson 2012-08-02 19:18:33

+0

@davidfmatheson輸入哪個wget,我得到'/ usr/local/bin/wget' – Joseph 2012-08-02 19:22:26

回答

3

如果wget確實安裝在您的OS X系統上,則嘗試指定其完整路徑。

嘗試:

which wget

在命令行,然後用你的Java應用程序,完全合格的路徑。

String whatToRun = "/usr/local/bin/wget http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe"; 
+0

謝謝,這工作! – Joseph 2012-08-02 19:30:46

2

相當明顯,wget默認情況下不會在OS X安裝

更有趣的東西是寫像wget自己的功能。

URL url = new URL("http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe"); 
InputStream in = url.openStream(); 
OutputStream os = new FileOutputStream(new File("picture.jpe")); 
byte byffer[] = new byte[1024]; 
int nBytesRead; 
while ((nBytesRead = in.read(buffer)) != -1) 
{ 
    os.write(buffer, 0, nBytesRead); 
} 
os.flush(); 
os.close(); 
in.close(); 
0

看起來像wget未安裝在該OSX系統上。 (它也不在我的身上,儘管它已經有幾代年紀了。)要麼安裝它,要麼找到另一種下載圖片的方式; Java畢竟具有本地內置的HTTP支持(請參閱java.net.URL類)。

+0

我確實在我的系統上安裝了wget,因爲直接從終端調用它工作 – Joseph 2012-08-02 19:23:37

+1

@Joseph:在這種情況下,您在運行Java的方式和終端的運行方式之間存在PATH差異。這很有可能,比如如果你的'.bashrc'中加了一個目錄,並且直接或間接從'launchd'運行Java程序(例如,在模擬shell的IDE中)。對路徑進行硬編碼將起作用,但會使代碼變得不可移植(程序位於不同系統上的不同位置)。 – 2012-08-02 21:21:37

2

這些答案都不能解釋您的實際問題。

Java失敗的原因是/ usr/local/bin不在PATH上。

很明顯,它在終端中運行的bash shell的路徑上。並且可能是你在Terminal中啓動的任何新的bash shell(或通過ssh或其他)。這可能是因爲你在〜/ .profile,〜/ .bash_profile,〜/ .bashrc或/ etc等文件中有一行像export PATH=$PATH:/usr/local/bin。在你的GUI上,你所有的東西都是登錄shell的孩子,所以把東西放在其中一個文件中(只要你選擇正確的東西)意味着Java將最終繼承那個PATH,不管它如何獲得推出。但是在Mac上,所有你的GUI都是launchd的孩子,你運行的任何shell只是你的GUI應用程序的兄弟,而不是父級。因此,在bash的啓動中設置PATH不會影響從Finder或IDE或其他任何設備啓動的內容。

一旦你明白了這個問題,你就可以理解所有不同的解決方案 - 你可以set the default environment launchd gives to user processes,或者在系統範圍內做同樣的事情,或者修改/ etc /路徑等。

0

,如果你得到這個錯誤,一個更多的時間,這樣執行命令:

which wget

Runtime.getRuntime().exec(new String[]{ "/bin/sh" , "-c" ,"/usr/local/bin/wget http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe" })