Переменная среды для управления java.io.tmpdir?

Я использовал переменную среды TMP для управления такими вещами, как то, где gcc записывает временные файлы, но я не могу найти эквивалент для java createTempFile API.

Существует ли такая переменная окружения?


person Zach Hirsch    schedule 17.12.2009    source источник
comment
Фактическая ссылка: java.sun.com/javase/6/docs/api/java/io/, java.lang.String, java.io.File) Stackoverflow не работает правильно, когда я помещаю этот URL в ( или когда я заменяю круглые скобки на% 28 и% 29). Я знаю, что использовать короткий URL-адрес - отстой, но я подумал, что это лучше, чем вообще без ссылки.   -  person Zach Hirsch    schedule 17.12.2009
comment
Исправил ссылку. ТАК поступает правильно.   -  person rmeador    schedule 17.12.2009
comment
Спасибо. Я предполагаю, что трюк также заменял пробелы на% 20   -  person Zach Hirsch    schedule 17.12.2009
comment
все, что я сделал, это перешел по вашей ссылке, скопировал URL-адрес из адресной строки моего браузера и вставил его в свой пост там, где была ваша короткая ссылка.   -  person rmeador    schedule 17.12.2009


Ответы (9)


Хммм - поскольку это обрабатывается JVM, я немного углубился в исходный код OpenJDK VM, думая, что, возможно, то, что сделано OpenJDK, имитирует то, что сделано в Java 6 и более ранних версиях. То, что это можно сделать, кроме Windows, не обнадеживает.

В Windows, функция get_temp_directory() OpenJDK выполняет вызов Win32 API для GetTempPath(); так в Windows Java отражает значение переменной среды TMP.

В Linux и Solaris те же get_temp_directory() функции возвращают статическое значение /tmp/.

Я не знаю, следует ли фактический JDK6 этим точным соглашениям, но, судя по поведению на каждой из перечисленных платформ, похоже, что они соблюдают.

person delfuego    schedule 17.12.2009
comment
Чтобы было ясно, вы смотрите на собственный код, который предоставляет значение по умолчанию для свойства java.io.tmpdir, когда JVM создает объект свойств системы. Это будет отменено (например) параметром -Djava.io.tmpdir = ... - person Stephen C; 18.12.2009
comment
@StephenC, да, в этом вся суть - OP искал, как значение по умолчанию для свойства устанавливается в отсутствие настройки его самостоятельно (через параметр командной строки -Djava.io.tmpdir для JVM), и если это значение по умолчанию будет затронуто совсем не по ценности окружающей среды. Как люди заметили, в Windows на нее влияет переменная среды TMP, но было неясно, существует ли какая-то неизвестная переменная для других ОС. Похоже, что нет, по крайней мере, с учетом того, что мы знаем об OpenJDK. - person delfuego; 18.12.2009
comment
Хороший ответ, но в Windows GetTempPath() зависит не только от переменной среды TMP: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx - person Dan Berindei; 29.05.2012
comment
Я видел, что в Solaris Sun JDK значение равно /var/tmp/ (с ведущей косой чертой), есть даже ошибка № 4391434 для этого. И для Mac OS и Linux это /tmp - что за беспорядок ! - person dma_k; 30.05.2012
comment
-Djava.io.tmpdir не работает в Linux с java8 (откройте jdk 1.8). - person Znik; 29.04.2016
comment
@Znik работает с oracle-java8-jdk=8u102 (linux) - person Alex; 02.09.2016
comment
В OpenJDK в Ubuntu я получаю /tmp при написании небольшой тестовой программы, которая просто распечатывает свойство, но по какой-то причине createTempDir Google из здесь, получив это свойство так же, как и я, предлагает var/tmp , без ведущей косой черты. Я определил это, запустив Druid под strace и просмотрев все обращения к mkdir. - person Throw Away Account; 06.04.2017

Согласно java.io.File Java Docs

Каталог временных файлов по умолчанию определяется системным свойством java.io.tmpdir. В системах UNIX значение этого свойства по умолчанию обычно равно «/ tmp» или «/ var / tmp»; в системах Microsoft Windows это обычно «c: \ temp». При вызове виртуальной машины Java этому системному свойству может быть присвоено другое значение, но не гарантируется, что программные изменения этого свойства окажут какое-либо влияние на временный каталог, используемый этим методом.

Чтобы указать системное свойство java.io.tmpdir, вы можете вызвать JVM следующим образом:

java -Djava.io.tmpdir=/path/to/tmpdir

По умолчанию это значение должно быть получено из переменной среды TMP в системах Windows.

person Bryan Kyle    schedule 17.12.2009
comment
Это не ответ на мой вопрос. Есть ли переменная среды, которая контролирует это? - person Zach Hirsch; 17.12.2009
comment
Несмотря на ваше редактирование, Брайан, java.io.tmpdir определенно не соответствует переменной среды TMPDIR на Mac или в Ubuntu (проверено 6.06). - person delfuego; 17.12.2009
comment
Ой, и еще одно редактирование, делающее все эти комментарии бессмысленными. - person delfuego; 17.12.2009
comment
@ Зак. Ответ зависит от платформы. - person Stephen C; 18.12.2009
comment
Это не так просто, и этот ответ все еще неверен. В Windows java.io.tmpdir определяется с помощью функции Windows SDK GetTempPath (msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx), который будет преобразован в TMP, TEMP, USERPROFILE или каталог Windows, если каждый из предыдущих не определен. - person Pascal Thivent; 18.12.2009

Вы можете установить свою _JAVA_OPTIONS переменную окружения. Например, в bash это поможет:

export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir

Я вставил это в свой сценарий входа в bash, и, похоже, это помогло.

person John St. John    schedule 03.04.2011
comment
Хотя это, похоже, работает в Linux и MacOSX, у него есть неприятный побочный эффект, заключающийся в том, что при каждом запуске java выводятся некоторые дополнительные данные: Picked up _JAVA_OPTIONS: Это полностью сбивает с толку наш процесс сборки. - person marc.guenther; 20.10.2011
comment
Я проголосовал за этот ответ, потому что он отвечает на вопрос пользователей, и пользователь не указал ОС или не хотел избежать каких-либо других побочных эффектов. Я считаю, что это должен быть лучший ответ - person R. van Twisk; 23.07.2012
comment
Эта переменная, похоже, специфична для Sun JVM - например, для Sun JVM. JVM IBM J9 не поддерживает его; вместо этого он поддерживает IBM_JAVA_OPTIONS - person sendmoreinfo; 09.10.2014
comment
@sendmoreinfo, насколько мне известно, он работает для Sun / Oracle и OpenJDK. - person John St. John; 09.10.2014
comment
Согласно этому ответу о различиях между переменными среды, JAVA_TOOL_OPTIONS более портативен. - person EndlosSchleife; 06.03.2019

Использовать

$ java -XshowSettings
Property settings:
    java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
    java.io.tmpdir = /tmp
person Nisar Ahmed    schedule 07.08.2013

Это не переменная среды, но все же дает вам контроль над временным каталогом:

-Djava.io.tmpdir

ex.:

java -Djava.io.tmpdir=/mytempdir
person Bozho    schedule 17.12.2009

Чтобы понять, что здесь происходит:

  • Рекомендуемый способ установить местоположение временного каталога - установить системное свойство под названием "java.io.tmpdir", например путем указания опции -Djava.io.tmpdir=/mytempdir команде java. Свойство также можно изменить из программы, вызвав System.setProperty("java.io.tmpdir", "/mytempdir) ... вопросы безопасности изолированной программной среды по модулю.

  • Если вы явно не устанавливаете свойство «java.io.tmpdir» при запуске, JVM инициализирует его значением по умолчанию для конкретной платформы. Для Windows значение по умолчанию получается путем вызова метода Win32 API. Для Linux / Solaris по умолчанию явно установлено жесткое соединение. Для других JVM это могло быть что-то другое.

Опытным путем переменная среды «TMP» работает в Windows (с текущими JVM), но не на других платформах. Если вы заботитесь о переносимости, вы должны явно установить системное свойство.

person Stephen C    schedule 18.12.2009

Используйте следующую команду на терминале UNIX:

java -XshowSettings

Это отобразит все свойства java и системные настройки. Здесь ищите значение java.io.tmpdir.

person suhas    schedule 20.06.2018

Если вы посмотрите исходный код JDK, вы увидите, что для систем unix свойство читается по адресу время компиляции из paths.h или жестко запрограммирован. Для окон функция GetTempPathW из win32 возвращает имя tmpdir.

Для систем posix вы можете ожидать, что стандарт TMPDIR будет работать, но это это не так. Вы можете подтвердить, что TMPDIR не используется, запустив TMPDIR=/mytmp java -XshowSettings

person SiggyF    schedule 06.01.2021

мы можем изменить местоположение загрузки файла tomcat по умолчанию, как

мы должны установить переменную окружения, например: CATALINA_TEMPDIR = ВАШ ФАЙЛ ЗАГРУЗИТЬ МЕСТО. это местоположение изменит путь здесь: java -Djava.io.tmpdir = / path / to / tmpdir

person anudq ece    schedule 04.02.2021
comment
Прочтите Как ответить и дополните свой ответ рекомендациями из руководства. - person fartem; 04.02.2021