我最近将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
。
来源:Changing the current working directory in Java?
所有权和权限得到正确处理。我正在寻找一个无需更改任何代码的系统端解决方案,因为相同的代码正在旧服务器中运行。