Переменная окружения для управления java.io.tmpdir?
Я использовал TMP
Переменная окружения для управления такими вещами, как, например, где gcc записывает свои временные файлы, но я не могу найти эквивалент для java's createTempFile API.
Существует ли такая переменная среды?
10 ответов
Хммм - так как это обрабатывается JVM, я немного углубился в исходный код виртуальной машины OpenJDK, думая, что, возможно, то, что сделано OpenJDK, имитирует то, что было сделано в Java 6 и ранее. Это не заверяет, что есть способ сделать это, кроме как в Windows.
В Windows OpenJDK get_temp_directory()
функция делает вызов Win32 API GetTempPath()
; это то, как в Windows, Java отражает ценность TMP
переменная окружения.
На Linux и Solaris одно и то же get_temp_directory()
функции возвращают статическое значение /tmp/
,
Я не знаю, соответствует ли настоящий JDK6 этим точным соглашениям, но по поведению на каждой из перечисленных платформ кажется, что они это делают.
Согласно java.io.File
Документы Java
Каталог временных файлов по умолчанию указывается системным свойством 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
You could set your _JAVA_OPTIONS
переменная среды For example in bash this would do the trick:
export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir
I put that into my bash login script and it seems to do the trick.
Использование
$ java -XshowSettings
Property settings:
java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
java.io.tmpdir = /tmp
Это не переменная окружения, но все же дает вам контроль над временным каталогом:
-Djava.io.tmpdir
напр.:
java -Djava.io.tmpdir=/mytempdir
Чтобы было понятно, что здесь происходит:
Рекомендуемый способ установки местоположения временного каталога - установить свойство System с именем "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), но не на других платформах. Если вы заботитесь о переносимости, вы должны явно установить системное свойство.
Используйте следующую команду на терминале UNIX:
java -XshowSettings
Это отобразит все свойства Java и системные настройки. В этом искать java.io.tmpdir
значение.
в настоящее время источник: https://github.com/openjdk/jdk/search?l=Java&p=4&q=java.io.tmpdir и используется только свойство.
для линукса:
// This must be hard coded because it's the system's temporary
// directory not the java application's temp directory, ala java.io.tmpdir.
const char* os::get_temp_directory() { return "/tmp"; }
- https://github.com/openjdk/jdk/blob/eab4c0c49934bd6f37a0b6174ca10e5c8708d13b/src/hotspot/os/linux/os_linux.cpp#L1317
- https://github.com/openjdk/jdk/blob/739769c8fc4b496f08a92225a12d07414537b6c0/src/java.base/unix/conf/net.properties
для окон:
if (GetTempPath(MAX_PATH, path_buf) > 0) {
return path_buf;
} else {
и здесь для яблока:https://github.com/openjdk/jdk/blob/739769c8fc4b496f08a92225a12d07414537b6c0/src/jdk.attach/macosx/native/libattach/VirtualMachineImpl.c#L322
мы можем изменить место загрузки файла tomcat по умолчанию, как
мы должны установить переменную среды, например: CATALINA_TEMPDIR = ВАШЕ МЕСТО ЗАГРУЗКИ ФАЙЛА. это место изменит путь здесь: java -Djava.io.tmpdir=/path/to/tmpdir
Если вы посмотрите исходный код JDK, вы увидите, что для систем unix свойство считывается во время компиляции из paths.h или жестко запрограммировано . Для окон функция
GetTempPathW
из win32 возвращает
tmpdir
имя.
Для posix-систем вы можете ожидать, что стандарт будет работать, но это не так. Вы можете подтвердить, что
TMPDIR
не используется при запуске
TMPDIR=/mytmp java -XshowSettings