无法创建tempDir,java.io.tmpdir设置为C:\ Windows \

时间:2018-05-30 13:08:31

标签: spring-boot tomcat tmp

我使用嵌入式tomcat的Spring Boot,一切正常,突然间我收到了错误:

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必须使用系统一的这个值,实际上是C:/ Windows / Temp

5 个答案:

答案 0 :(得分:12)

如果使用IDEA,请在“运行/调试配置”的“环境变量”窗口中选中“包括父级环境变量”。

答案 1 :(得分:2)

我观察到以下行为

  • 突然改变了一切
  • 如果从命令行作为独立的jar运行,则可以正常工作
  • 从IntelliJ(2018.1)运行时失败

作为一种快速的解决方法,我在运行配置中明确添加了-Djava.io.tmpdir=$EXISING_DIR_WITH_WRITE_ACCESS作为JVM参数。

答案 2 :(得分:0)

就我而言,将默认工作空间库从[jre.1.8.0_121]更改为[jdk.1.8.0_121]时出现了问题。将其重新设置为jre似乎已解决了该问题。

答案 3 :(得分:0)

如果使用eclipse,请在“运行/调试配置”的“环境变量”窗口中选中“附加到环境变量”。

感谢上面的@max答案

我正在使用JAVA EE蚀-光子

答案 4 :(得分:0)

在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.

因此,如果您的应用程序启动时未定义TMPTEMPUSERPROFILE,则会得到java.io.tmpdir == GetWindowsDirectoryA

通常,应用程序在java.io.tmpdir(通过app-run.bat)或-D...=...内设置app.properties

我遇到了这个问题,因为如果Test属性没有传递而是被替换,那么Gradle 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
}