Как настроить 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

Другие вопросы по тегам