Как настроить root для временных каталогов в Java
Мы запускаем код, который делает стандарт для создания временного каталога:
import java.nio.file.Files;
А потом:
tmp = Files.createTempDirectory("ourprefix-");
Это, по сути, создает каталоги под /tmp/
так что мы получаем такие вещи, как /tmp/ourprefix-1234
или похожие.
К сожалению, этот базовый каталог /tmp/
похоже, исправлено, и, поскольку на нашем сервере сборки многие вещи обычно размещают свои временные данные, а раздел, в котором находится / tmp /, довольно мал, это проблема.
Есть ли способ настроить это средство извне (т.е. без изменения кода)? Я бы догадался что /tmp/
является значением по умолчанию и может быть переопределено путем установки специальной переменной среды или (более Javaish) передачи специального свойства компилятору (например, -Djava.tmp.root=/path/to/my/larger/partition/tmp
).
Я пытался с помощью java.io.tmpdir
но установка этого не имела никакого эффекта; похоже, по умолчанию, если ничего не дано createTempDirectory()
но в нашем случае код передает префикс.
Любая идея, как добиться того, что я хочу без изменения исходного кода?
РЕДАКТИРОВАТЬ
После некоторого расследования я обнаружил, что это прекрасно работает:
import java.nio.file.Path;
import java.nio.file.Files;
import java.io.IOException;
public class TestTempDir {
public static void main(String[] args) throws IOException {
System.out.println(System.getProperty("java.io.tmpdir"));
Path path = Files.createTempDirectory("myprefix-");
System.out.println(path.toFile().getAbsolutePath());
}
}
Компилировать с javac TestTempDir.java
подготовить с mkdir tmp
и беги с java -Djava.io.tmpdir=
PWD/tmp TestTempDir
это просто работает как ожидалось:
/my/work/path/tmp
/my/work/path/tmp/myprefix-1525078348397347983
Скорее всего, моя проблема связана с Jenkins и его плагином Maven, который не передает установленные свойства в тестовые случаи:-/
1 ответ
Если вы пройдете java.io.tmpdir
свойство как пользовательское свойство JVM при запуске JVM, оно должно работать.
Что-то вроде того:
java -Djava.io.tmpdir=myPath myClass
Я проверил, и это работает:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class TestTempDir {
public static void main(String[] args) throws IOException {
System.out.println(System.getProperty("java.io.tmpdir"));
Path dir = Files.createTempDirectory("helloDir");
System.out.println(dir.toString());
}
}
$ java -Djava.io.tmpdir = D: \ temp TestTempDir
D: \ Temp
D: \ Temp\helloDir5660384505531934395