Змінна середовища для управління java.io.tmpdir?


109

Я використовував TMPзмінну середовища для контролю таких речей, як, де gcc пише, що це тимчасові файли, але я не можу знайти еквівалент API JavaTaTeTFFile для Java .

Чи існує така змінна середовище?


Фактичне посилання - 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 цим точним умовам, але поведінка на кожній із перерахованих платформ здається, що вони є.


38
Щоб було зрозуміло, що ви дивитесь - це нативний код, який надає значення за замовчуванням для властивості "java.io.tmpdir", коли JVM створює об'єкт "Системні властивості". Це буде замінено (наприклад) опцією "-Djava.io.tmpdir = ...".
Стівен C

6
@StephenC, так, справа в цьому - ОП шукав, як встановлюється значення властивості за замовчуванням для властивості за відсутності встановлення її самостійно (через параметр -Djava.io.tmpdirкомандного рядка до JVM), і якщо це значення за замовчуванням впливає на все за значенням середовища. Як спостерігали люди, на Windows , то це залежить від TMPзмінної оточення, але було неясно, чи є якась - то невідома змінна для інших операційних систем. Схоже, немає, принаймні з огляду на те, що ми знаємо про OpenJDK.
delfuego

5
Приємна відповідь, але на Windows GetTempPath()не впливає лише TMPзмінна середовища: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei

Я бачив, що на 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властивість системи, ви можете викликати JVM наступним чином:

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

За замовчуванням це значення має надходити від TMP змінної середовища в системах Windows


1
Це не відповідає на моє запитання. Чи існує змінна середовища, яка контролює це?
Зах Гірш

3
Незважаючи на вашу редакцію, Bryan, java.io.tmpdir, безумовно, не відповідає змінній середовища TMPDIR на Mac або Ubuntu (тестовано 6.06).
delfuego

Ой, і ще одна редакція, тому всі ці коментарі здаються безглуздими.
delfuego

@Zach. Відповідь - конкретна платформа.
Стівен C

12
Це не так просто, і ця відповідь досі є неправильною. У Windows java.io.tmpdirвизначається за допомогою функції SDK для Windows GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ), яка визначатиме TMP або TEMP або USERPROFILE або каталог Windows, якщо кожен з них попередній не визначений.
Паскаль Thivent

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
Я проголосував за цю відповідь, оскільки він відповідає на запитання користувачів, а користувач не вказав ОС або не хотів уникнути будь-яких інших побічних ефектів. Я вважаю, що це має бути найкращою відповіддю
R. van Twisk

3
Ця змінна, здається, є специфічною для Sun JVM - якщо IBM J9 JVM не підтримує її; він підтримує IBM_JAVA_OPTIONS замість цього
sendmoreinfo

@sendmoreinfo, наскільки мені відомо, це працює для Sun / Oracle та OpenJDK.
Іоанн Сент Іван

1
Відповідно до цієї відповіді про відмінності між змінними середовища, вона JAVA_TOOL_OPTIONSє більш портативною.
EndlosSchleife

38

Використовуйте

$ 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 за замовчуванням отримується виклик методу API Win32. Для Linux / Solaris за замовчуванням, мабуть, є провідним. Для інших JVM це може бути щось інше.

Емпірично змінна середовища "TMP" працює в Windows (з поточними JVM), але не на інших платформах. Якщо ви ставитесь до портативності, вам слід чітко встановити властивість системи.


2

Використовуйте команду нижче на терміналі UNIX:

java -XshowSettings

Це покаже всі властивості java та налаштування системи. У цьому шукайте java.io.tmpdirзначення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.