我在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完成?
提前致谢。
答案 0 :(得分:0)
如果进程每次都要求密码并由JVM使用,则可以使用System.setProperty(..)从java添加。这与为jvm参数提供-D选项基本相同。
而不是
pb.environment().put(userName, encryptedPassword);
可以写
System.setProperty("userName",userName);
System.setProperty("encryptedPassword", encryptedPassword);