一、问题
在实现一个逻辑时,需要从java -jar的启动命令中获取自定义的程序参数,在代码中进行业务逻辑判断。
启动命令:
java -server -Dspring.profiles.active=local -Dgpu=true -Dfile.encoding=utf-8 -Duser.timezone=Asia/Shanghai -Xms512m -Xmx512m -Dnacos.config.server-addr=127.0.0.1:8848 -Dnacos.discovery.server-addr=127.0.0.1:8848 -jar ./local-file-system-dev-e7fcd518-20230808161338.jar
其中,-Dgpu=true为所加的程序参数。
Springboot启动类main方法:
后发现业务功能一直没有生效,后排查查看日志,发现输出的args竟然为空!
二、问题原因及解决方式
这个因为在使用 java -jar 命令启动 Java 应用程序时,参数的顺序和位置有一些讲究。
具体主要有几种形式:
形式一:
-DpropName=propName
-DpropName=propName的形式,需要放在-jar参数的前面。
示例:
命令: java -Dxxx=value -jar xxx.jar
代码中取值,需要改为这样:System.getProperty("xxx"),而不是args
调整之后,可看到已经正常获取到相应的参数值:
形式二:
参数跟在命令后面。
如果想要通过args获取,程序参数应该放在java -jar命令中的jar文件名之后,即在-jar之后指定。
示例:
java -jar xxx.jar arg1 arg2 -Dxxx=value
按这种形式调整之后,可看到也可正常获取到相应的参数值:
形式三:
springboot, --key=value方式
示例:
java -jar xxx.jar --xxx=value
代码中取值:Spring的@Value("${xxx}")
按这种形式调整,可看到也可正常获取到相应的参数值:
总结
使用java -jar命令启动Java应用程序时,参数的顺序和位置有所有将就,具体体现为三种形式:
方式一:
命令: java -Dxxx=value -jar xxx.jar<br>
代码中取值:System.getProperty("xxx")
方式二:
命令: java -jar xxx.jar arg1 arg2 -Dxxx=value
代码中取值:System.getProperty("xxx")
System.getProperty("arg1")
方式三:
java -jar xxx.jar --xxx=value
代码中取值:Spring的@Value("${xxx}")
算是比较细节的问题,日常工作如果不常用或没有用过,可能没有注意到。而工作中,有时就是因为这样的细节的小问题,可能会被卡住很久,因为可能压根没有往这儿怀疑,像这次遇到的问题就是这样.
特此记录下。