使用Java(OSX)在终端中调用命令

时间:2012-08-02 19:11:24

标签: java macos terminal wget osx-mountain-lion

我正在尝试编写Java代码来运行wget以从服务器检索图像

我相信我已经正确安装了wget。如果我输入:

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

我在用户帐户文件夹中找到了该图片。

以下Java代码在Ubuntu上正常运行,但我不得不将项目移至OSX(Mountain Lion)

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:无法运行程序“wget”:error = 2,没有这样的文件   或目录

如果有人能告诉我自己做错了什么,我将不胜感激。

5 个答案:

答案 0 :(得分:3)

如果您的OS X系统上确实安装了wget,请尝试指定它的完整路径。

尝试:

  

哪个wget

从命令行

,然后在Java应用程序中使用该完全限定的路径。

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

答案 1 :(得分:2)

很明显,OS X中默认不安装wget

更有趣的是编写像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();

答案 2 :(得分:2)

这些答案都不能解释您的实际问题。

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

显然它位于你在终端中运行的bash shell的路径上。可能是你在终端(或通过ssh,或其他)开始的任何新的bash shell。这可能是因为你在〜/ .profile,〜/ .bash_profile,〜/ .bashrc或/ etc等价物中有一行像export PATH=$PATH:/usr/local/bin一样。

在linux上,所有的GUI东西都是登录shell的子代,所以把东西放在其中一个文件中(只要你选择正确的文件)意味着无论它如何启动,Java都将最终继承该PATH 。但是在Mac上,你所有的GUI都是launchd的孩子,你运行的任何shell都只是你的GUI应用程序的兄弟,而不是父。因此,在bash的启动中设置PATH不会影响从Finder或IDE或其他任何东西启动的内容。

一旦你理解了这个问题,你就可以理解所有不同的解决方案 - 你可以set the default environment launchd gives to user processes,或者在系统范围内做同样的事情,或者修改/ etc / paths等。

答案 3 :(得分:0)

看起来该OSX系统上没有安装wget。 (它不在我的身上,尽管它已经老了几代。)要么安装它,要么找另一种下载图片的方式; Java确实本身就内置了HTTP支持(参见java.net.URL类)。

答案 4 :(得分:0)

如果再次出现此错误,请执行以下命令:

  

哪个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" })