私は埋め込み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の代わりにこの値を使用する
IDEAを使用する場合は、実行/デバッグ構成の[環境変数]ウィンドウで[親環境変数を含める]をオンにします。
次の動作を観察しました
簡単な回避策として、実行構成のJVMパラメーターとして-Djava.io.tmpdir=$EXISING_DIR_WITH_WRITE_ACCESS
を明示的に追加しました。
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
プロパティが渡されずに置き換えられた場合、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
}
Eclipseを使用する場合は、実行/デバッグ構成の[環境変数]ウィンドウで[環境変数に追加]をチェックします。
上記の@max回答のおかげで
私はJava EE Eclipse-photonを使用していました
私の場合、デフォルトのワークスペースライブラリを[jre.1.8.0_121]から[jdk.1.8.0_121]に変更したときに問題が発生しました。 jreに戻すことで問題が修正されたようです。