(Он, потому что это - Java и поэтому я не должен делать злых непортативных устаревших вещей как касание моей среды?)
я думаю, что Вы попали в точку.
А возможный способ упростить нагрузку состоял бы в том, чтобы факторизовать метод
void setUpEnvironment(ProcessBuilder builder) {
Map<String, String> env = builder.environment();
// blah blah
}
и передать любой ProcessBuilder
с через него прежде, чем запустить их.
кроме того, Вы, вероятно, уже знаете это, но можно запустить больше чем один процесс с того же ProcessBuilder
. Таким образом, если Ваши подпроцессы являются тем же, Вы не должны делать этой установки много раз.
public static void set(Map<String, String> newenv) throws Exception {
Class[] classes = Collections.class.getDeclaredClasses();
Map<String, String> env = System.getenv();
for(Class cl : classes) {
if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
Field field = cl.getDeclaredField("m");
field.setAccessible(true);
Object obj = field.get(env);
Map<String, String> map = (Map<String, String>) obj;
map.clear();
map.putAll(newenv);
}
}
}
Или добавить/обновить единственный var и удаление цикла согласно предложению thejoshwolfe.
@SuppressWarnings({ "unchecked" })
public static void updateEnv(String name, String val) throws ReflectiveOperationException {
Map<String, String> env = System.getenv();
Field field = env.getClass().getDeclaredField("m");
field.setAccessible(true);
((Map<String, String>) field.get(env)).put(name, val);
}
Вводя по абсолютному адресу вокруг онлайн, похоже, что могло бы быть возможно сделать это с JNI. Необходимо было бы тогда позвонить putenv () от C, и необходимо будет (по-видимому), сделать это способом, это работало и над Windows и над UNIX.
, Если все, что может быть сделано, это, конечно, не было бы слишком трудно для самого Java поддерживать это вместо того, чтобы поместить меня в прямой конверт.
друг разговора Perl А в другом месте предполагает, что это вызвано тем, что переменные среды являются глобальным процессом, и Java борется за хорошую изоляцию для хорошего дизайна.
Можно передать параметры в начальный процесс Java с-D:
java -cp <classpath> -Dkey1=value -Dkey2=value ...
вариант jython на основе @pushy ответ, работы над окнами.
def set_env(newenv):
from java.lang import Class
process_environment = Class.forName("java.lang.ProcessEnvironment")
environment_field = process_environment.getDeclaredField("theEnvironment")
environment_field.setAccessible(True)
env = environment_field.get(None)
env.putAll(newenv)
invariant_environment_field = process_environment.getDeclaredField("theCaseInsensitiveEnvironment");
invariant_environment_field.setAccessible(True)
invevn = invariant_environment_field.get(None)
invevn.putAll(newenv)
Использование:
old_environ = dict(os.environ)
old_environ['EPM_ORACLE_HOME'] = r"E:\Oracle\Middleware\EPMSystem11R1"
set_env(old_environ)