Установка системных переменных Windows с Java - PullRequest
2 голосов
/ 22 декабря 2009

Есть ли способ добавить определенный каталог в системную переменную Windows% PATH%? Это не похоже на работу:

String[] cmd = { "cmd", "/c", "set", "PATH=\"%PATH%;c:\\test\"" };
Runtime.getRuntime().exec( cmd );

c: \ test \ не отображается в System.getenv ("PATH"); или на выходе

String[] cmd = { "cmd", "/c", "echo", "%PATH%" };
Runtime.getRuntime().exec( cmd );

Мне нужно изменить переменную% PATH% для текущего Java-процесса под Windows. Причина в том, что мне нужно загрузить некоторые собственные dll-файлы, которые ссылаются друг на друга. Поэтому я хотел бы добавить путь к приложению в среду Windows.

Следующим, что я попробовал, был маленький JNI-Wrapper для C-функции "putenv", который выглядит так:

JNIEXPORT void JNICALL Java_com_splitscreen_AppletTest_PutEnv_putEnv
  (JNIEnv *env, jobject jobj, jstring val) {

    jboolean iscopy;

    const char *mvalue = (*env)->GetStringUTFChars(
                env, val, &iscopy);

    putenv(mvalue);
}

Вот как я это называю:

final String curPath = System.getenv( "PATH" );
final PutEnv pe = new PutEnv();
pe.putEnv( "PATH=" + curPath + ";c:\test" );

final String newPath = System.getenv( "PATH" );
System.out.println( newPath );

Но пути равны. Я не уверен, не обновлена ​​ли карта Java-System-Environment или не работает putenv. Есть ли способ проверить это?

Ответы [ 4 ]

9 голосов
/ 22 декабря 2009

Причина, по которой это не работает, состоит в том, что два вызова exec() запускают две разные оболочки; тот, в котором вы указали путь, не тот, в котором вы его отметили.

Трудно изменить постоянную общесистемную настройку пути. Но вы можете изменить путь на время вызова одной или нескольких программ, для которых он вам нужен.

В частности, вам нужно написать себе пакетный файл (.CMD или .BAT, как вам угодно), установить PATH в начале, следуйте этому с любыми командами DOS / Windows, которые вы захотите. как выполняется с этим путем, а затем exec() этот файл сценария.


Обновление PATH для текущего Java процесса кажется довольно бессмысленным. Java, однажды запущенная, не заботится о пути. Или вы используете какой-нибудь библиотечный код?

Если вы выполняете команды DOS / Windows из Java с использованием exec(), вышеописанный прием будет работать.


Обновление: Хорошо, у вас есть библиотечный код, который по своим собственным причинам хочет, чтобы PATH был установлен именно так, и вы хотите дать ему то, что он хочет.

Что я хотел бы рассмотреть, так это запустить новую JVM. Вы можете использовать exec(cmd, envp) для запуска нового Java-приложения («вы сами» в крайнем случае) с пользовательским набором переменных среды в envp. Просто скопируйте те, которые уже есть, и манипулируйте содержимым PATH, если есть.

Стандартный способ запуска нового Java-приложения - это создание нового ClassLoader, и есть различные описания того, как этого добиться. Но я не уверен, что вы можете использовать эту процедуру для создания новой среды, так что exec - JVM может быть не только проще, но, возможно, и единственным способом.

1 голос
/ 22 декабря 2009

Вы можете передавать пути к местным библиотекам с помощью опции -Djava.library.path, если вы используете расширения JNI, это также может работать в вашем случае exec. Другой вариант - запустить приложение java из пакетного файла и отредактировать настройки PATH в интерпретаторе команд. «Перед» запуском приложения java приложение java унаследует эти настройки PATH.

NASA WorldWind использует нативные библиотеки и может быть запущен как апплет. Вот инструкция по настройке этого параметра с помощью JNLPAppletLauncher . По сути, это обнаруживает ОС, извлекает соответствующие нативные библиотеки, сохраняет их в папке по умолчанию для пути jvm и выполняет. Вызов exec из Java-апплета нарушает все виды нормальных принципов безопасности и песочницы, и я бы на самом деле этого не делал.

1 голос
/ 22 декабря 2009

Это невозможно только при запуске командного файла. Смотрите здесь подробности .

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

0 голосов
/ 22 декабря 2009

Вы можете попробовать использовать setenv.exe (из здесь ) вместо cmd /c.
или setx.exe от Microsoft .

...