Java 如何在Tomcat中配置当前工作目录?

Java 如何在Tomcat中配置当前工作目录?,java,linux,tomcat,Java,Linux,Tomcat,我最近将tomcat应用程序从一台Linux服务器迁移到另一台。从那时起,我在新服务器上面临一个新的文件创建问题。在新服务器中,当我尝试创建文件时失败,这在旧服务器中运行良好: File convFile = new File(file.getOriginalFilename()); convFile.createNewFile(); //this FAILS FileOutputStream fos = new FileOutputStream(convFile); fos.write(fil

我最近将tomcat应用程序从一台Linux服务器迁移到另一台。从那时起,我在新服务器上面临一个新的文件创建问题。在新服务器中,当我尝试创建文件时失败,这在旧服务器中运行良好:

File convFile = new File(file.getOriginalFilename());
convFile.createNewFile(); //this FAILS
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();
为了调查该问题,我使用以下方法打印了工作目录:

String cwd = new File("").getAbsolutePath();
System.out.println(cwd);
这次调试揭示了问题背后的根本原因: 旧服务器返回:var/lib/tomcat,而新服务器返回:/(根目录) 由于tomcat用户没有(也不应该)对根目录的写入权限,因此无法创建该文件

我的问题是,哪个因素决定了Tomcat当前的工作目录,以及如何配置它

以下是我的Tomcat和java环境变量

Environment="JAVA_HOME=/usr/lib/jvm/jre"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"

Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
更新:我尝试了
-Duser.dir
来配置工作目录。使用此函数后,我从
System.out.println(cwd)获得了预期的结果。但问题仍然存在,文件创建失败。显然,这不适用于
FileOutputStreams

资料来源:


所有权和权限处理正确。我正在寻找一种不进行任何代码更改的系统端解决方案,因为相同的代码在旧服务器中工作。

web应用程序永远不应该依赖于工作目录。servlet容器可以为多个web应用程序提供服务,否则它们可能需要不同的工作目录,而这是不可能发生的,因此永远不要依赖工作目录来处理web应用程序中的任何内容。在代码需要使用文件系统时始终使用绝对路径,除了临时文件之外,文件系统本身应该很少使用;失败?异常和消息是什么?您应该使用
ServletContext.getRealPath()
,而不是当前的工作目录,以便获得每个servlet的路径。@jordiburgos以下是详细信息:2019年10月25日11:52:37.029严重[ajp-nio-8009-exec-45]controller.FileUploadController.convert null java.io.IOException:在ca.pbl.smart.controller.FileUploadController.convert(FileUploadController.java:449)处java.io.UnixFileSystem.createfileexclusive(本机方法)处java.io.File.createNewFile(File.java:1012)的权限被拒绝,更改尝试创建新文件的文件夹。web应用程序不应依赖于工作目录。servlet容器可以为多个web应用程序提供服务,否则它们可能需要不同的工作目录,而这是不可能发生的,因此永远不要依赖工作目录来处理web应用程序中的任何内容。在代码需要使用文件系统时始终使用绝对路径,除了临时文件之外,文件系统本身应该很少使用;失败?异常和消息是什么?您应该使用
ServletContext.getRealPath()
,而不是当前的工作目录,以便获得每个servlet的路径。@jordiburgos以下是详细信息:2019年10月25日11:52:37.029严重[ajp-nio-8009-exec-45]controller.FileUploadController.convert null java.io.IOException:在ca.pbl.smart.controller.FileUploadController.convert(FileUploadController.java:449)处java.io.UnixFileSystem.createfileexclusive(本机方法)处java.io.File.createNewFile(File.java:1012)的权限被拒绝,更改尝试创建新文件的文件夹。