经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
[Java SE] 彻底搞懂Java程序的三大参数配置途径:系统变量与JVM参数(VM Option)/环境变量/启动程序参数args
来源:cnblogs  作者:千千寰宇  时间:2023/6/9 14:27:47  对本文有异议

0 序言

一次没搞懂,处处受影响。这个问题属于基础问题,但又经常踩坑,不得不重视一下了。

1 Java程序动态参数的配置途径:系统变量与JVM参数(VM Option) vs 环境变量 vs 启动程序参数args

IDEA中的配置位置

参数 使用方式 示例 代码获取方式
系统属性 由操作系统、JVM、应用程序主动设置 System.setProperties(Properties propes) / System.setProperties(String key,String value) / System.getProperties().load(String filename) / ... String value = System.getProperty(propertyName);
VM Options(JVM参数) 优先级高于系统变量。必须以-D-X-XX 开头,每个参数用空格隔开 -Dvm.key=VmKey -Dvm.key2=VmKey2 String key = System.getProperty(vm.key);
Program Arguments 每个参数用空格隔开 p.key=Program_Key p.name=ProgramName p.age=18 main(String[] args)
Environment Variable(环境变量) 我的电脑-属性-高级环境设置-环境变量内配置系统属性。其优先级低于 VM options ,即如果VM options 有一个变量和 Environment variable中的变量的key相同,则以VM options 中为准, 以分号分割多个 env.key=env_james;server.servlet.context-path=/test;server.port=8080 String envKey = System.getenv(“env.key”);

2 工具类:SystemVariableTool

  1. import cn.xx.bd.xx.common.debug.Print;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.boot.ApplicationArguments;
  5. import org.springframework.boot.DefaultApplicationArguments;
  6. import org.springframework.util.ObjectUtils;
  7. import java.util.*;
  8. /**
  9. * @author johnny-zen
  10. * @version v1.0
  11. * @create-time 2023/6/9 9:57
  12. * @description 系统属性读取工具
  13. * [VM options]
  14. * VM options其实就是我们在程序中需要的运行时环境变量,它需要以-D或-X或-XX开头,每个参数使用空格分隔
  15. * 使用最多的就是-Dkey=value设定系统属性值,比如-Dspring.profiles.active=dev3
  16. * [Program arguments]
  17. * Program arguments为我们传入main方法的字符串数组args[],它通常以--开头,如--spring.profiles.active=dev3
  18. * 等价于-Dspring.profiles.active=dev3如果同时存在,以Program arguments配置优先
  19. * @refrence-doc
  20. * @gpt-promt
  21. */
  22. public class SystemVariableTool {
  23. private final static Logger logger = LoggerFactory.getLogger(SystemVariableTool.class);
  24. public static final String SYSTEM_PROPERTY_PARAM = "SYSTEM_PROPERTY";
  25. public static final String ENVIRONMENT_VARIABLE_PARAM = "ENVIRONMENT_VARIABLE";
  26. /** args **/
  27. public static final String ARGS_PARAM = "ARGS_PARAM";
  28. // 可选参数
  29. public static final String OPTION_ARG_PARAM = "OPTION_ARG_VARIABLE";
  30. // 非可选参数
  31. public static final String NON_OPTION_ARG_PARAM = "NON_OPTION_ARG_PARAM";
  32. private ApplicationArguments applicationArguments;
  33. public SystemVariableTool(ApplicationArguments applicationArguments){
  34. this.applicationArguments = applicationArguments;
  35. }
  36. /**
  37. * 读取系统属性
  38. * @param propertyName
  39. * @config-method 配置方法
  40. * 1 ) IDEA - (Select one Program) - Edit Configurations - VM Options - ( "-Dserver.port=8088" / "-Xmx239m" )
  41. * @sample
  42. * server.port
  43. * -----------------------------
  44. * java.version Java 运行时环境版本
  45. * java.vendor Java 运行时环境供应商
  46. * java.vendor.url Java 供应商的 URL
  47. * java.home Java 安装目录
  48. * java.vm.specification.version Java 虚拟机规范版本
  49. * java.vm.specification.vendor Java 虚拟机规范供应商
  50. * java.vm.specification.name Java 虚拟机规范名称
  51. * java.vm.version Java 虚拟机实现版本
  52. * java.vm.vendor Java 虚拟机实现供应商
  53. * java.vm.name Java 虚拟机实现名称
  54. * java.specification.version Java 运行时环境规范版本
  55. * java.specification.vendor Java 运行时环境规范供应商
  56. * java.specification.name Java 运行时环境规范名称
  57. * java.class.version Java 类格式版本号
  58. * java.class.path Java 类路径
  59. * java.library.path 加载库时搜索的路径列表
  60. * java.io.tmpdir 默认的临时文件路径
  61. * java.compiler 要使用的 JIT 编译器的名称
  62. * java.ext.dirs 一个或多个扩展目录的路径
  63. * os.name 操作系统的名称
  64. * os.arch 操作系统的架构 例如: "amd64"
  65. * os.version 操作系统的版本 例如: "10.0"
  66. * file.separator 文件分隔符(在 UNIX 系统中是"/")
  67. * path.separator 路径分隔符(在 UNIX 系统中是":")
  68. * line.separator 行分隔符(在 UNIX 系统中是"/n")
  69. * user.country 用户所在国家
  70. * user.name 用户的账户名称
  71. * user.home 用户的主目录 例如: "C:\Users\Johnny"
  72. * user.dir 用户的当前工作目录 例如: "E:\source_code\BigData\bdp_common_data_service"
  73. * user.language 用户当前的语言 例如: "zh"
  74. * user.timezone 用户所在时区 例如: "Asia/Shanghai"
  75. * @return
  76. */
  77. public static String getSystemProperty(String propertyName){
  78. Map enviromentProperties = System.getProperties();
  79. return (String) enviromentProperties.get(propertyName);
  80. }
  81. /**
  82. * 读取环境变量
  83. * @config-method 配置方式 :
  84. * 优先级 : 方式1 < 方式2
  85. * 1) My Computer - 属性 - 高级系统设置 - 环境变量 - ...
  86. * 2) IDEA - (Select one Program) - Edit Configurations - Environment Variables - ( ENV_VAR="env-var-demo" server.port=8090 ...)
  87. *
  88. * @sample
  89. * USERPROFILE :用户目录
  90. * USERDNSDOMAIN :用户域
  91. * PATHEXT :可执行后缀
  92. * JAVA_HOME :Java安装目录
  93. * TEMP :用户临时文件目录
  94. * SystemDrive :系统盘符
  95. * ProgramFiles :默认程序目录
  96. * USERDOMAIN :帐户的域的名称
  97. * ALLUSERSPROFILE :用户公共目录
  98. * SESSIONNAME :Session名称
  99. * TMP :临时目录
  100. * Path :path环境变量
  101. * CLASSPATH :classpath环境变量
  102. * PROCESSOR_ARCHITECTURE :处理器体系结构
  103. * OS :操作系统类型
  104. * PROCESSOR_LEVEL :处理级别
  105. * COMPUTERNAME :计算机名
  106. * Windir :系统安装目录
  107. * SystemRoot :系统启动目录
  108. * USERNAME :用户名
  109. * ComSpec :命令行解释器可执行程序的准确路径
  110. * APPDATA :应用程序数据目录
  111. * @return
  112. */
  113. public static String getEnvironmentVariable(String variableName){
  114. Map enviromentProperties = System.getenv();
  115. return (String) enviromentProperties.get(variableName);
  116. }
  117. public Map<String, Object> getVariables(String variableName){
  118. Map<String, Object> resultMap = new HashMap<>();
  119. String systemProperty = getSystemProperty(variableName);
  120. resultMap.put(SYSTEM_PROPERTY_PARAM, systemProperty);
  121. String environmentVariable = getEnvironmentVariable(variableName);
  122. resultMap.put(ENVIRONMENT_VARIABLE_PARAM, environmentVariable);
  123. //解析 args
  124. String argsValue = null;
  125. String[] args = applicationArguments.getSourceArgs();
  126. if(!ObjectUtils.isEmpty(args)){
  127. for(int i = 0; i < args.length; i++){
  128. if(args[i].toLowerCase().contains(variableName.toLowerCase())){
  129. argsValue = args[i];
  130. }
  131. }
  132. }
  133. resultMap.put(ARGS_PARAM, argsValue);
  134. /**
  135. * 解析选项参数
  136. * @description
  137. * 1. 不同框架 对 args 的解析策略均不同。例如 Flink 的 ParameterTool 与 SpringBoot 的 DefaultApplicationArguments,解析规则和解析结果有很大差异
  138. * 1. 基于 SpringBoot 的 ApplicationArguments 接口, DefaultApplicationArguments 。 如果是以”--“为前缀,则判定为选项参数;反之,被判定为 非选项参数
  139. * @sample
  140. * [1] 选项参数的有效示例
  141. * --foo
  142. * --foo=
  143. * --foo=""
  144. * --foo=bar
  145. * --foo="bar then baz"
  146. * --foo=bar,baz,biz
  147. * [2] 选项参数的无效示例
  148. * -foo
  149. * --foo bar
  150. * --foo = bar
  151. * --foo=bar --foo=baz --foo=biz
  152. */
  153. List<String> optionArgs = applicationArguments.getOptionValues(variableName);// args = { "--foo="bar then baz" } , variableName = "foo" => optionArgs = {"bar then baz"}
  154. resultMap.put(OPTION_ARG_PARAM, optionArgs);
  155. List<String> allNonOptionArgs = applicationArguments.getNonOptionArgs();// { "server.port=8089" , "server.port=8090", "boo=bar,then,baz" , "foo=bar then baz" }
  156. List<String> nonOptionArgs = new ArrayList<>();
  157. for(int i=0;i<allNonOptionArgs.size();i++){
  158. if(allNonOptionArgs.get(i).toLowerCase().contains(variableName.toLowerCase())){
  159. nonOptionArgs.add( allNonOptionArgs.get(i) );
  160. }
  161. }
  162. resultMap.put(NON_OPTION_ARG_PARAM, nonOptionArgs);
  163. return resultMap;
  164. }
  165. public static void main(String[] args) {
  166. ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
  167. SystemVariableTool systemPropertiesUtil = new SystemVariableTool(applicationArguments);
  168. Map<String, Object> map = systemPropertiesUtil.getVariables("server.port");
  169. Print.print(map);
  170. }
  171. }

X 参考文献

原文链接:https://www.cnblogs.com/johnnyzen/p/17469131.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号