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

Posted

技术标签:

【中文标题】无法创建 tempDir,java.io.tmpdir 设置为 C:\\Windows\\【英文标题】:Unable to create tempDir, java.io.tmpdir is set to C:\Windows\无法创建 tempDir,java.io.tmpdir 设置为 C:\Windows\ 【发布时间】:2018-11-09 08:38:58 【问题描述】:

我正在使用带有嵌入式 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 user 变量正在查看 C:/Users/me/AppData/Local/Temp ,我猜 tomcat 必须使用系统一的这个值,其实就是C:/Windows/Temp

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

在 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

我遇到了这个问题,因为如果 environment 属性没有被传递而是被替换,Gradle Test 任务将不会传递环境变量:

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 可能改变了什么?)【参考方案3】:

我观察到以下行为

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

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

【讨论】:

是的,它解决了问题,但更多的是关于解决方法,无论如何标记为已解决,谢谢【参考方案4】:

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

感谢@max 上面的回答

我使用的是 JAVA EE eclipse - photon

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于无法创建 tempDir,java.io.tmpdir 设置为 C:\Windows\的主要内容,如果未能解决你的问题,请参考以下文章

跪求答案:ubuntu下:mount /dev/sda1 /media/tempdir 后提示mount:您必须制定文件系统类型。在线等。急

phpMyAdmin 错误消息“$cfg['TempDir'] (./tmp/) 不可访问。”

重装Win7后找回Ubuntu启动项并在Ubuntu中修复引导

catalina.home和catalina.base这两个属性的作用

php MySQL 配置

Phpmyadmin 4.9.5 -> $cfg['TempDir'] (/var/lib/phpmyadmin/tmp/) 不可访问,即使它存在并且具有正确的权限