Tomcat中System.getenv("AppData")返回错误路径问题求助
这问题我之前帮同事排查过,核心原因是Tomcat的运行身份和你在Eclipse里跑代码的身份完全不一样!
为什么会出现这个差异?
在Eclipse里运行代码时,程序是用你当前登录的用户(ZXC)启动的,所以System.getenv("AppData")能正确读取到你的用户目录下的AppData路径。但如果Tomcat是作为Windows服务运行的,它默认会使用Local System账户启动——这个系统内置账户的AppData路径本来就和普通用户不同,你看到的C:\Windows\System32\config\AppData\Roaming其实是系统解析时的路径偏差,真实对应的是C:\Windows\System32\config\systemprofile\AppData\Roaming,但这个路径对你的业务来说毫无意义。
几种可行的解决办法
修改Tomcat服务的运行账户(推荐)
打开Windows服务管理器,找到你的Tomcat服务,右键选择「属性」→切换到「登录」选项卡,选择「此账户」,输入你当前的用户账户(ZXC)和对应的密码,点击确定后重启Tomcat服务。这样Tomcat就会以你的用户身份运行,System.getenv("AppData")就能拿到正确的C:\Users\ZXC\AppData\Roaming路径了。注意:要确保这个用户账户拥有Tomcat安装目录、webapps目录的读写权限,不然Tomcat可能启动失败。
硬编码工具路径(应急方案)
如果暂时不想修改服务配置,可以在代码里直接指定构建工具的绝对路径:String toolPath = "C:\\Users\\ZXC\\AppData\\Roaming\\npm\\xyz";但这种方式灵活性很差,换用户或者换机器就得改代码,不推荐长期使用。
在Tomcat配置中自定义环境变量
找到Tomcat安装目录下的bin文件夹,如果没有setenv.bat文件就新建一个,在里面添加一行:set AppData=C:\Users\ZXC\AppData\Roaming保存后重启Tomcat,这样Tomcat运行时就会优先使用这个自定义的
AppData环境变量。
内容的提问来源于stack exchange,提问作者Muneeb Mirza

