使用ProcessBuilder

时间:2018-02-12 23:05:19

标签: java shell ant aix processbuilder

我在Unix上运行Java程序(具体是AIX),需要调用外部shell脚本。另外,我需要设置一些可供shell脚本使用的环境变量(从技术上讲,它们需要可用于shell脚本调用的Ant程序)。我知道这个设置听起来很奇怪,但我的Java程序是一个包装预先存在的Ant脚本的安装程序。我想用它来提示输入一些密码作为环境变量加载到Ant脚本中作为加密值。

我的问题是我添加的环境变量对于shell脚本是不可见的,并且通过扩展,我的Ant脚本是不可见的。我正在使用ProcessBuilder.enviroment()映射来设置如下:

ProcessBuilder pb = new ProcessBuilder("build.sh", "install");

pb.directory("app_root/install"));

//if we have encrypted passwords, set them as environment variables on the child process
if (this.encryptedPasswords.size() > 0)
{
    for (Entry<String,String> entry : this.encryptedPasswords.entrySet())
    {
        String userName = entry.getKey();
        String encryptedPassword = entry.getValue();

        if (this.debug == true)
            System.out.println("Adding environment variable [" + userName + "] with value [" + encryptedPassword + "]");

        pb.environment().put(userName, encryptedPassword);
    }
}

我的shell脚本(我不能轻易改变)基本上是这样的:

#!/bin/sh

. ./build.env.sh

ant -buildfile build_impl.xml $*

build.env.sh脚本设置并导出一些环境变量,如WEBLOGIC_HOME等,这些变量是静态的,也是Ant脚本使用的。

这个概念在Windows上有效。我确信这是我不熟悉的Unix / AIX。例如,我是否需要导出这些新的环境变量?如果是这样,如何从Java中的ProcessBuilder完成?

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果进程每次都要求密码并由JVM使用,则可以使用System.setProperty(..)从java添加。这与为jvm参数提供-D选项基本相同。

而不是

pb.environment().put(userName, encryptedPassword);

可以写

    System.setProperty("userName",userName);
    System.setProperty("encryptedPassword", encryptedPassword);