Невозможно создать tempDir, java.io.tmpdir установлен в C: \ Windows \

Я использую Spring Boot со встроенным tomcat, все работало нормально, и внезапно я получил ошибку:

Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to create tempDir. java.io.tmpdir is set to C:\Windows\
    at org.springframework.boot.context.embedded.AbstractEmbeddedServletContainerFactory.createTempDir(AbstractEmbeddedServletContainerFactory.java:183)
    at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:165)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)
    ... 11 common frames omitted
Caused by: java.io.IOException: Access is denied
    at java.io.WinNTFileSystem.createFileExclusively(Native Method)
    at java.io.File.createTempFile(File.java:2024)
    at java.io.File.createTempFile(File.java:2070)
    at org.springframework.boot.context.embedded.AbstractEmbeddedServletContainerFactory.createTempDir(AbstractEmbeddedServletContainerFactory.java:174)
    ... 14 common frames omitted

Никаких манипуляций с пользовательскими или системными переменными не делал.

Моя переменная TEMP Пользователь смотрит на C: / Users / меня / AppData / Local / Temp, и я предполагаю, что tomcat должен использовать это значение вместо системного, которое на самом деле является C: / Windows / Temp

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
15
0
13 205
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я заметил следующее поведение

  • изменился внезапно
  • работает, если запустить из командной строки как автономную банку
  • не работает при запуске из IntelliJ (2018.1)

В качестве быстрого обходного пути я явно добавил -Djava.io.tmpdir=$EXISING_DIR_WITH_WRITE_ACCESS в качестве параметра JVM в конфигурациях запуска.

да, это решает проблему, но это скорее обходные пути, в любом случае отметьте как решенную, спасибо

ilya 05.07.2018 12:40
Ответ принят как подходящий

Если вы используете IDEA, установите флажок «Включить родительские переменные среды» в окне «Переменные среды» в конфигурации «Запуск / отладка».

В моем случае проблема возникла, когда я изменил библиотеку рабочей области по умолчанию с [jre.1.8.0_121] на [jdk.1.8.0_121]. Возвращение к jre, похоже, устранило проблему.

Если вы используете eclipse, отметьте «Добавить к переменным среды» в окне «Переменные среды» в конфигурации «Запуск / отладка».

Благодаря ответу @max выше

Я использовал Eclipse JAVA EE - фотон

В Windows GetTempPathA используется для поиска временного каталога. Алгоритм:

1. The path specified by the TMP environment variable.
2. The path specified by the TEMP environment variable.
3. The path specified by the USERPROFILE environment variable.
4. The Windows directory.

Итак, если ваше приложение запускается без определенных TMP, TEMP и USERPROFILE, вы получите java.io.tmpdir == GetWindowsDirectoryA.

Обычно приложения устанавливают java.io.tmpdir внутри app-run.bat (через -D...=...) или app.properties.

Я столкнулся с этой проблемой, потому что задача Gradle Test не будет передавать переменные среды, если свойства environment не передаются, а заменяются:

test {
    environment = ["A": "1", "B": "2"] // won't work, because it replaces envs
}

test {
    environment( ["A": "1", "B": "2"] ) // will work, because it appends to existing envs
}

Ах, это все объясняет. В какой-то момент я, должно быть, переключил свою конфигурацию запуска Eclipse с «Добавить среду ...» на «Заменить среду ...», отключив эти переменные. (Раньше я думал, что мое приложение так работало, но, возможно, JDK 8 -> 11 или Windows 7 -> 10 что-то изменили?)

Luke Usherwood 26.12.2019 13:57

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