Index: F:/izpack/IzPack/src/lib/com/izforge/izpack/installer/ProcessPanelWorker.java =================================================================== --- F:/izpack/IzPack/src/lib/com/izforge/izpack/installer/ProcessPanelWorker.java (revision 2230) +++ F:/izpack/IzPack/src/lib/com/izforge/izpack/installer/ProcessPanelWorker.java (working copy) @@ -34,6 +34,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Vector; /** @@ -182,7 +183,17 @@ args.add(arg_val); } - ef_list.add(new ExecutableFile(ef_name, args)); + List envvars = new ArrayList(); + + for (XMLElement env_el : ef.getChildrenNamed("env")) + { + String env_val = env_el.getContent(); + + envvars.add(env_val); + } + + + ef_list.add(new ExecutableFile(ef_name, args, envvars)); } for (XMLElement ef : job_el.getChildrenNamed("executeclass")) @@ -360,32 +371,47 @@ private List arguments; + private List envvariables; + protected AbstractUIProcessHandler handler; - public ExecutableFile(String fn, List args) + public ExecutableFile(String fn, List args, List envvars) { this.filename = fn; this.arguments = args; + this.envvariables = envvars; } public boolean run(AbstractUIProcessHandler handler, VariableSubstitutor vs) { this.handler = handler; - String params[] = new String[this.arguments.size() + 1]; + List params = new ArrayList(this.arguments.size() + 1); - params[0] = vs.substitute(this.filename, "plain"); + params.add(vs.substitute(this.filename, "plain")); - int i = 1; for (String argument : this.arguments) { - params[i++] = vs.substitute(argument, "plain"); + params.add(vs.substitute(argument, "plain")); } + ProcessBuilder pb = new ProcessBuilder(params); + Map environment = pb.environment(); + for (String envvar : envvariables) + { + String ev = vs.substitute(envvar, "plain"); + int i = ev.indexOf("="); + if (i > 0) + { + environment.put(ev.substring(0, i), ev.substring(i + 1)); + } + } + try { - Process p = Runtime.getRuntime().exec(params); + Process p = pb.start(); + OutputMonitor stdoutMon = new OutputMonitor(this.handler, p.getInputStream(), false); OutputMonitor stderrMon = new OutputMonitor(this.handler, p.getErrorStream(), true); Thread stdoutThread = new Thread(stdoutMon);