Вопрос:
Я использую 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/me/AppData/Local/Temp, и я думаю, что tomcat должен использовать это значение insted для системного, которое на самом деле C: /Windows/Temp
Лучший ответ:
Если вы используете проверку IDEA “Включить переменные родительской среды” в окне “Переменные среды” в “Конфигурация запуска/отладки”.
Ответ №1
Я заметил следующее поведение
- внезапно изменился
- работает, если выполняется из командной строки как автономная банка
- не работает при запуске IntelliJ (2018.1)
В качестве быстрого обхода я явно добавил -Djava.io.tmpdir=$EXISING_DIR_WITH_WRITE_ACCESS как параметр JVM в конфигурациях запуска.
Ответ №2
В моем случае проблема возникла, когда я изменил свою библиотеку рабочего пространства по умолчанию с [jre.1.8.0_121] на [jdk.1.8.0_121]. Установка его обратно в jre, похоже, устранила проблему.
Ответ №3
Если вы используете eclipse, отметьте “Добавить к переменным среды” в окне “Переменные среды” в конфигурации “Выполнить/отладить”.
Благодаря @max ответ выше
Я использовал JAVA EE Eclipse – фотон
Ответ №4
В 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 или app.properties.
Я столкнулся с этой проблемой, потому что задача Gradle Test не будет передавать переменные environment если свойства 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 }