【问题标题】:Call a command in terminal using Java (OSX)使用 Java (OSX) 在终端中调用命令
【发布时间】:2012-07-31 19:45:15
【问题描述】:

我正在尝试编写 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”:错误=2,没有这样的文件 或目录

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

【问题讨论】:

  • 我建议你安装Homebrew。然后你可以在终端中输入brew install wget,wget 就会被安装。来自 Ubuntu,这对您来说非常直观。
  • 他们说他们安装了wget。打开终端并输入which wget。这应该会告诉你它是否存在。
  • @davidfmatheson 输入 which wget,我得到 /usr/local/bin/wget
  • @user1572320 在下面试试我的答案,指定 wget 的完整路径。

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


【解决方案1】:

如果您再次遇到此错误,请执行以下命令:

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

【讨论】:

    【解决方案2】:

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

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

    显然它位于您在终端中运行的 bash shell 的路径上。并且可能是您在终端中启动的任何新 bash shell(或通过 ssh 或其他方式)。这可能是因为您在 ~/.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】:

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

      试试:

      哪个wget

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

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

      【讨论】:

        【解决方案4】:

        看起来wget 没有安装在那个 OSX 系统上。 (它也不在我的身上,尽管它比我老了几代。)要么安装它,要么找到另一种下载图片的方法;毕竟,Java 确实具有原生内置的 HTTP 支持(参见 java.net.URL 类)。

        【讨论】:

        • 我的系统上确实安装了 wget,因为可以直接从终端调用它
        • @Joseph:在这种情况下,您运行 Java 的方式和终端运行的方式之间存在路径差异。这是很有可能的,例如,如果您在 .bashrc 中添加了一个目录,并且正在从 launchd 直接或间接运行 Java 程序(例如,在模拟 shell 的 IDE 中)。硬编码路径会起作用,但会使代码不可移植(程序位于不同系统上的不同位置)。
        【解决方案5】:

        很明显,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();
        

        【讨论】:

          猜你喜欢
          • 2014-07-02
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          • 2015-03-14
          • 1970-01-01
          • 2015-11-21
          • 2020-06-10
          • 2014-03-17
          相关资源
          最近更新 更多