Springboot启动类main方法args参数获取不到启动命令中的业务参数

469 阅读1分钟

一、问题

在实现一个逻辑时,需要从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方法:

image.png

后发现业务功能一直没有生效,后排查查看日志,发现输出的args竟然为空!

image.png

二、问题原因及解决方式

这个因为在使用 java -jar 命令启动 Java 应用程序时,参数的顺序和位置有一些讲究。

具体主要有几种形式:

形式一:
-DpropName=propName -DpropName=propName的形式,需要放在-jar参数的前面。 示例:

命令: java -Dxxx=value -jar xxx.jar
代码中取值,需要改为这样:System.getProperty("xxx"),而不是args

调整之后,可看到已经正常获取到相应的参数值: image.png image.png

形式二:
参数跟在命令后面。 如果想要通过args获取,程序参数应该放在java -jar命令中的jar文件名之后,即在-jar之后指定。
示例:

java -jar xxx.jar arg1 arg2 -Dxxx=value

按这种形式调整之后,可看到也可正常获取到相应的参数值: image.png

image.png

形式三:
springboot, --key=value方式

示例:

java -jar xxx.jar --xxx=value
代码中取值:Spring的@Value("${xxx}")

按这种形式调整,可看到也可正常获取到相应的参数值:

image.png image.png

image.png


总结

使用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}")

算是比较细节的问题,日常工作如果不常用或没有用过,可能没有注意到。而工作中,有时就是因为这样的细节的小问题,可能会被卡住很久,因为可能压根没有往这儿怀疑,像这次遇到的问题就是这样.

特此记录下。