Как я устанавливаю переменные среды от Java?

269
задан mkobit 27 December 2018 в 07:37
поделиться

5 ответов

(Он, потому что это - Java и поэтому я не должен делать злых непортативных устаревших вещей как касание моей среды?)

я думаю, что Вы попали в точку.

А возможный способ упростить нагрузку состоял бы в том, чтобы факторизовать метод

void setUpEnvironment(ProcessBuilder builder) {
    Map<String, String> env = builder.environment();
    // blah blah
}

и передать любой ProcessBuilder с через него прежде, чем запустить их.

кроме того, Вы, вероятно, уже знаете это, но можно запустить больше чем один процесс с того же ProcessBuilder. Таким образом, если Ваши подпроцессы являются тем же, Вы не должны делать этой установки много раз.

85
ответ дан Michael Myers 23 November 2019 в 02:21
поделиться
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);
  }
56
ответ дан Kashyap 23 November 2019 в 02:21
поделиться

Вводя по абсолютному адресу вокруг онлайн, похоже, что могло бы быть возможно сделать это с JNI. Необходимо было бы тогда позвонить putenv () от C, и необходимо будет (по-видимому), сделать это способом, это работало и над Windows и над UNIX.

, Если все, что может быть сделано, это, конечно, не было бы слишком трудно для самого Java поддерживать это вместо того, чтобы поместить меня в прямой конверт.

друг разговора Perl А в другом месте предполагает, что это вызвано тем, что переменные среды являются глобальным процессом, и Java борется за хорошую изоляцию для хорошего дизайна.

4
ответ дан skiphoppy 23 November 2019 в 02:21
поделиться

Можно передать параметры в начальный процесс Java с-D:

java -cp <classpath> -Dkey1=value -Dkey2=value ...
-9
ответ дан matt b 23 November 2019 в 02:21
поделиться

на основе @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)
0
ответ дан 23 November 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: