Я использую 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




Я заметил следующее поведение
В качестве быстрого обходного пути я явно добавил -Djava.io.tmpdir=$EXISING_DIR_WITH_WRITE_ACCESS в качестве параметра JVM в конфигурациях запуска.
Если вы используете 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 что-то изменили?)
да, это решает проблему, но это скорее обходные пути, в любом случае отметьте как решенную, спасибо