的Java:调用Runtime.getRuntime()EXEC(CMD)错误与某些命令,但与其他命令

的Java:调用Runtime.getRuntime()EXEC(CMD)错误与某些命令,但与其他命令

问题描述:

作品这是我的代码:的Java:调用Runtime.getRuntime()EXEC(CMD)错误与某些命令,但与其他命令

public static void main(String[] args) throws Exception { 
    String[] cmd = {"which", "hive"}; 

    Process proc = Runtime.getRuntime().exec(cmd); 

    BufferedReader reader = new BufferedReader(
     new InputStreamReader(proc.getInputStream())); 

    String line = ""; 
    while((line = reader.readLine()) != null) { 
     System.out.print(line + "\n"); 
    } 

    proc.waitFor(); 
} 

在我的终端:

which hive:/home/as/hive/bin/hive 
which gcc:/usr/bin/gcc 

但是,当我运行这个Java代码:

which hive:no result 
which gcc:/usr/bin/gcc 

我已经添加到$HIVE_HOME~/.bashrc(我使用Ubuntu 14.04 64位和JA VA 8),那么我现在应该做什么?

+0

如果你想看到的错误,我建议你阅读错误流。或者,您可以将两个流合并为一个,以便于阅读。 – 2014-12-13 13:48:41

+2

你如何运行Java?当您运行Java时,您确定配置单元在您的PATH中吗?尝试打印'System.out.println(System.getenv()。get(“PATH”));' – 2014-12-13 13:52:16

命令which查找环境变量PATH中指定的所有目录。在Linux上,目录由冒号(:)分隔,在Windows中以分号(;)分隔。

你可以查阅一下PATH被传递给which通过做

System.out.println(System.getenv("PATH")); 

而且你可以通过不同的路径Runtime.exec

String[] env = { "PATH=/home/as/hive/bin" }; 
Process proc = Runtime.getRuntime().exec(cmd, env); 

如果你这样做,它which会发现hive命令(但它不会再找到gcc,除非您还将/usr/bin添加到PATH,如PATH=/home/as/hive/bin:/usr/bin

+0

as @ ubuntu:〜$ echo $ PATH;/usr/local/sbin:/ usr/local/sbin:/ usr/bin/sbin:/ usr/bin:/ sbin:/ bin:/ usr/games:/ usr/local/sbin: /home/as/jdk1.8.0_25/bin:/home/as/hadoop/bin:/home/as/hadoop/sbin:/home/as/bin:/home/as/jdk1.8.0_25/bin:/家用/为/ sqoop-1.4.5.bin__hadoop-2.0。4-alpha/bin:/ home/as/hbase/bin:/ home/as/hive/bin – voxter 2014-12-15 13:37:16

+0

in java: System.out.println(System.getenv()。get(“PATH”)); 结果: /usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin:/ usr/games:/ usr/local/games:/ home/as /bin:/home/as/jdk1.8.0_25/bin – voxter 2014-12-15 13:38:07

+0

为什么我们有这个不同点?我瘦了这是我们的问题 – voxter 2014-12-15 13:38:51

在我的终端中:
as @ ubuntu:〜$ echo $ PATH;
/usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin:/ usr/games:/ usr/local/games:/ home/as/bin :/home/as/jdk1.8.0_25/bin:/家庭/为/ Hadoop的/ bin中:/家庭/为/ Hadoop的/ sbin目录:/家庭/中的/ bin:/home/as/jdk1.8.0_25/bin: /home/as/sqoop-1.4.5.bin__hadoop-2.0.4-alpha/bin:/home/as/hbase/bin:/home/as/hive/bin
但在java中:
System.out。的println(System.getenv()获得( “PATH”));

结果:
在/ usr/local/sbin中:在/ usr/local/bin目录:/ usr/sbin目录:在/ usr/bin中:/ sbin目录:/ bin中:在/ usr /游戏:/ usr/local/games:/ home/as/bin:/home/as/jdk1.8.0_25/bin
所以这是我的账户$ PATH根$ PATH?
那么如何解决它?