web-dev-qa-db-ja.com

tempDirを作成できません。Java.io.tmpdirはC:\ Windows \に設定されています

私は埋め込み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 ser変数はC:/ Users /me/ AppData/Local/Tempを探しており、Tomcatは実際にはC:/ Windows/Tempであるシステム1の代わりにこの値を使用する

11
ilya

IDEAを使用する場合は、実行/デバッグ構成の[環境変数]ウィンドウで[親環境変数を含める]をオンにします。

15
Max

次の動作を観察しました

  • 突然変わった
  • 自己完結型jarとしてコマンドラインから実行すると機能します
  • intelliJ(2018.1)から実行すると失敗する

簡単な回避策として、実行構成のJVMパラメーターとして-Djava.io.tmpdir=$EXISING_DIR_WITH_WRITE_ACCESSを明示的に追加しました。

2
HannesB

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.tmpdirapp-run.bat内(-D...=...経由)またはapp.propertiesに設定します。

Gradle 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
}
1
gavenkoa

Eclipseを使用する場合は、実行/デバッグ構成の[環境変数]ウィンドウで[環境変数に追加]をチェックします。

上記の@max回答のおかげで

私はJava EE Eclipse-photonを使用していました

0

私の場合、デフォルトのワークスペースライブラリを[jre.1.8.0_121]から[jdk.1.8.0_121]に変更したときに問題が発生しました。 jreに戻すことで問題が修正されたようです。

0
rodicc