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

110

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

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

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

Ответы:

118

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

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

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

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

дельфуэго
источник
39
Чтобы было ясно, вы смотрите на собственный код, который предоставляет значение по умолчанию для свойства «java.io.tmpdir», когда JVM создает объект свойств системы. Это будет отменено (например) параметром "-Djava.io.tmpdir = ...".
Stephen C
6
@StephenC, да, вот в чем дело - OP искал, как значение по умолчанию для свойства устанавливается в отсутствие настройки его самостоятельно (через параметр -Djava.io.tmpdirкомандной строки для JVM), и если это значение по умолчанию влияет на все по ценности окружающей среды. Как наблюдали люди, на Windows , то это зависит от TMPпеременной окружения, но было неясно, есть ли какая - то неизвестная переменная для других операционных систем. Похоже, что нет, по крайней мере, с учетом того, что мы знаем об OpenJDK.
delfuego
5
Хороший ответ, но на Windows GetTempPath()влияет не только TMPпеременная среды: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Дэн Бериндей,
Я видел, что в Solaris Sun JDK значение равно /var/tmp/(с ведущей косой чертой), для этого даже есть ошибка # 4391434 . А для Mac OS и Linux это/tmp - какой бардак!
dma_k
1
@Znik действительно работает с oracle-java8-jdk=8u102(linux)
Alex
118

Согласно java.io.FileJava Docs

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

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

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

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

Брайан Кайл
источник
1
Это не ответ на мой вопрос. Есть ли переменная среды, которая контролирует это?
Зак Хирш
3
Несмотря на ваше редактирование, Брайан, java.io.tmpdir определенно не соответствует переменной среды TMPDIR на Mac или в Ubuntu (проверено 6.06).
delfuego
Ой, и еще одно редактирование, делающее все эти комментарии бессмысленными.
delfuego
@ Зак. Ответ зависит от платформы.
Stephen C
12
Это не так просто, и этот ответ все еще неверен. В Windows java.io.tmpdirопределяется с помощью функции Windows SDK GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ), которая будет преобразована в TMP, TEMP, USERPROFILE или каталог Windows, если каждый из предыдущее не определяется.
Паскаль Тивент
62

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

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

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

Джон Сент-Джон
источник
3
Хотя это, похоже, работает в Linux и MacOSX, у него есть неприятный побочный эффект, заключающийся в том, что при каждом запуске java выводятся некоторые дополнительные данные: Picked up _JAVA_OPTIONS:это полностью сбивает с толку наш процесс сборки.
marc.guenther
3
Я проголосовал за этот ответ, потому что он отвечает на вопрос пользователей, и пользователь не указал ОС или не хотел избежать каких-либо других побочных эффектов. Я считаю, что это должен быть лучший ответ
Р. ван Твиск
3
Эта переменная, похоже, специфична для Sun JVM - например, IBM J9 JVM ее не поддерживает; вместо этого он поддерживает IBM_JAVA_OPTIONS
sendmoreinfo
@sendmoreinfo, насколько мне известно, он работает для Sun / Oracle и OpenJDK.
Джон Сент-Джон
1
Согласно этому ответу о различиях между переменными среды, JAVA_TOOL_OPTIONSболее переносимый.
EndlosSchleife
40

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

$ java -XshowSettings
Property settings:
    java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
    java.io.tmpdir = /tmp
Нисар Ахмед
источник
28

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

-Djava.io.tmpdir

напр .:

java -Djava.io.tmpdir=/mytempdir
Божо
источник
17

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

  • Рекомендуемый способ установить местоположение временного каталога - установить системное свойство с именем "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), но не на других платформах. Если вы заботитесь о переносимости, вы должны явно установить системное свойство.

Стивен С
источник
2

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

java -XshowSettings

Это отобразит все свойства java и системные настройки. В этом ищите java.io.tmpdirценность.

Сухас
источник