使用Java(OSX)在终端中调用命令
我正在尝试编写Java代码来运行wget以从服务器检索图像
我相信我已经正确安装了。 如果我输入:
wget http://sofzh.miximages.com/java/insitu38795.jpg
我在用户帐户文件夹中找到了该图像。
以下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://sofzh.miximages.com/java/insitu38795.jpg"; 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,没有这样的文件或目录
如果有人能告诉我我做错了什么,我将不胜感激。
如果确实在OS X系统上安装了wget
,则尝试指定它的完整路径。
尝试:
哪个wget
从命令行,然后在Java应用程序中使用该完全限定的路径。
String whatToRun = "/usr/local/bin/wget http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe";
很明显,OS X中默认不安装wget
。
更有趣的是编写像你自己的wget这样的function。
URL url = new URL("http://sofzh.miximages.com/java/insitu38795.jpg"); 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();
这些答案都没有解释您的实际问题。
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都将最终inheritance该PATH。 但是在Mac上,你所有的GUI都是launchd的孩子,你运行的任何shell都只是你的GUI应用程序的兄弟,而不是父。 因此,在bash的启动中设置PATH不会影响从Finder或IDE或其他任何东西启动的内容。
一旦理解了问题,就可以理解所有不同的解决方案 – 您可以设置launchd为用户进程提供的默认环境 ,或者在系统范围内执行相同的操作,或者修改/ etc / paths等。
看起来好像没有在该OSX系统上安装wget
。 (它不在我的身上,尽管它已经老了几代了。)要么安装它,要么找另一种下载图片的方式; Java本身就具有内置的HTTP支持(参见java.net.URL
类)。
如果再次出现此错误,请执行以下命令:
哪个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" })