You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8调用System.getProperty获取含>的系统属性时解析错误取值异常

问题结论

这既不是Java的固有设计,也不是JDK的功能Bug,本质是命令行特殊字符未转义导致的参数传递错误,不需要删除密码里的>字符,只要做好参数转义就能正常取值。

异常根因

你遇到的取值错乱,和java.lang.System.getProperty()方法本身的实现没有关系。
你在启动参数里写的-DTEST_PASSWORD=Pa$$w0rd>中,>是Shell环境默认识别的输出重定向特殊字符,如果没有手动转义,Shell不会把它当成普通字符串内容传入JVM,反而会把>之后的内容截断作为重定向的目标路径处理。
最终JVM实际收到的系统属性是断裂的:TEST_PASSWORD的值被截断为Pa$$w0rd,原本属于TEST_HOST的=google.com片段被错误拼接,才会返回你看到的Pa$$w0rd=google.com的错误结果。

解决方案

不需要修改原有密码内容,只需要根据启动Tomcat的运行环境,对包含特殊字符的参数做转义处理即可:

  • Linux/macOS(Bash/Zsh类Shell):推荐用单引号直接包裹整个属性值,这种写法会自动屏蔽所有特殊字符的解析,也不会误解析密码里的$为Shell变量:
    -DTEST_PASSWORD='Pa$$w0rd>'
    
    也可以在每个特殊字符前加反斜杠\转义,但是写起来更繁琐。
  • Windows Cmd环境:在>特殊字符前加^做转义即可:
    -DTEST_PASSWORD=Pa$$w0rd^>
    
  • Windows PowerShell环境:用双引号把整个系统属性参数包裹起来:
    "-DTEST_PASSWORD=Pa$$w0rd>"
    

转义完成后重启Tomcat,再调用System.getProperty("TEST_PASSWORD")就能拿到完整正确的密码值,Java本身对系统属性值包含>这类特殊字符没有任何限制。

内容的提问来源于stack exchange,提问作者Ashuni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:42:27