У меня есть автономное приложение, упакованное в JAR, которое при выполнении распаковывает себя во временный каталог и порождает дочерний процесс в этом каталоге. Причина в том, что какой-то сторонний код и конфигурация предполагают, что файлы данных находятся относительно текущего рабочего каталога, а в java нет метода chdir(), поэтому единственный способ - переключить рабочий каталог для дочернего процесса.
Все работает нормально, кроме системных свойств. Оператор может принять решение указать в командной строке некоторые свойства системы, как стандартные, так и связанные со сторонней конфигурацией:
java -Djava.io.tmpdir=/temp -Dsomething=else -jar foo.jar (parameters)
Системные свойства, доступные родительскому процессу Java, по умолчанию не распространяются на дочерний процесс. Я должен сделать это сам. И здесь у меня возникает препятствие: я не могу сказать, какие свойства устанавливаются оператором, а какие по умолчанию инициализируются JVM.
Возьмите этот java.io.tmpdir. Если оператор предоставил его, у него есть веская причина для этого (возможно, расположение по умолчанию — «диск заполнен»). Я должен установить его как дочерний процесс, иначе он потерпит неудачу. Но как я узнаю, пришло ли оно от оператора? Это может быть просто значение по умолчанию.
Я могу попробовать установить все доступные системные свойства для дочернего процесса. Однако это занимает длинный список и, что еще хуже, не работает в некоторых средах, где длина командной строки ограничена.
Единственный обходной путь, который я нашел до сих пор (довольно злой), - это сначала создать еще один дочерний процесс без каких-либо аргументов и позволить ему передать родителю все системные свойства, которые у него есть. Значения, которые соответствуют значениям родительского элемента, являются значениями по умолчанию. Остальное должно быть передано рабочему дочернему процессу.
У кого-нибудь есть лучшая альтернатива?