[Java SE] 彻底搞懂Java程序的三大参数配置途径:系统变量与JVM参数(VM Option)/环境变量/启动程序参数args

您所在的位置:网站首页 配置idea的环境变量 [Java SE] 彻底搞懂Java程序的三大参数配置途径:系统变量与JVM参数(VM Option)/环境变量/启动程序参数args

[Java SE] 彻底搞懂Java程序的三大参数配置途径:系统变量与JVM参数(VM Option)/环境变量/启动程序参数args

2023-06-13 14:01| 来源: 网络整理| 查看: 265

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 import cn.xx.bd.xx.common.debug.Print; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.DefaultApplicationArguments; import org.springframework.util.ObjectUtils; import java.util.*; /** * @author johnny-zen * @version v1.0 * @create-time 2023/6/9 9:57 * @description 系统属性读取工具 * [VM options] * VM options其实就是我们在程序中需要的运行时环境变量,它需要以-D或-X或-XX开头,每个参数使用空格分隔 * 使用最多的就是-Dkey=value设定系统属性值,比如-Dspring.profiles.active=dev3 * [Program arguments] * Program arguments为我们传入main方法的字符串数组args[],它通常以--开头,如--spring.profiles.active=dev3 * 等价于-Dspring.profiles.active=dev3如果同时存在,以Program arguments配置优先 * @refrence-doc * @gpt-promt */ public class SystemVariableTool { private final static Logger logger = LoggerFactory.getLogger(SystemVariableTool.class); public static final String SYSTEM_PROPERTY_PARAM = "SYSTEM_PROPERTY"; public static final String ENVIRONMENT_VARIABLE_PARAM = "ENVIRONMENT_VARIABLE"; /** args **/ public static final String ARGS_PARAM = "ARGS_PARAM"; // 可选参数 public static final String OPTION_ARG_PARAM = "OPTION_ARG_VARIABLE"; // 非可选参数 public static final String NON_OPTION_ARG_PARAM = "NON_OPTION_ARG_PARAM"; private ApplicationArguments applicationArguments; public SystemVariableTool(ApplicationArguments applicationArguments){ this.applicationArguments = applicationArguments; } /** * 读取系统属性 * @param propertyName * @config-method 配置方法 * 1 ) IDEA - (Select one Program) - Edit Configurations - VM Options - ( "-Dserver.port=8088" / "-Xmx239m" ) * @sample * server.port * ----------------------------- * java.version Java 运行时环境版本 * java.vendor Java 运行时环境供应商 * java.vendor.url Java 供应商的 URL * java.home Java 安装目录 * java.vm.specification.version Java 虚拟机规范版本 * java.vm.specification.vendor Java 虚拟机规范供应商 * java.vm.specification.name Java 虚拟机规范名称 * java.vm.version Java 虚拟机实现版本 * java.vm.vendor Java 虚拟机实现供应商 * java.vm.name Java 虚拟机实现名称 * java.specification.version Java 运行时环境规范版本 * java.specification.vendor Java 运行时环境规范供应商 * java.specification.name Java 运行时环境规范名称 * java.class.version Java 类格式版本号 * java.class.path Java 类路径 * java.library.path 加载库时搜索的路径列表 * java.io.tmpdir 默认的临时文件路径 * java.compiler 要使用的 JIT 编译器的名称 * java.ext.dirs 一个或多个扩展目录的路径 * os.name 操作系统的名称 * os.arch 操作系统的架构 例如: "amd64" * os.version 操作系统的版本 例如: "10.0" * file.separator 文件分隔符(在 UNIX 系统中是"/") * path.separator 路径分隔符(在 UNIX 系统中是":") * line.separator 行分隔符(在 UNIX 系统中是"/n") * user.country 用户所在国家 * user.name 用户的账户名称 * user.home 用户的主目录 例如: "C:\Users\Johnny" * user.dir 用户的当前工作目录 例如: "E:\source_code\BigData\bdp_common_data_service" * user.language 用户当前的语言 例如: "zh" * user.timezone 用户所在时区 例如: "Asia/Shanghai" * @return */ public static String getSystemProperty(String propertyName){ Map enviromentProperties = System.getProperties(); return (String) enviromentProperties.get(propertyName); } /** * 读取环境变量 * @config-method 配置方式 : * 优先级 : 方式1 < 方式2 * 1) My Computer - 属性 - 高级系统设置 - 环境变量 - ... * 2) IDEA - (Select one Program) - Edit Configurations - Environment Variables - ( ENV_VAR="env-var-demo" server.port=8090 ...) * * @sample * USERPROFILE :用户目录 * USERDNSDOMAIN :用户域 * PATHEXT :可执行后缀 * JAVA_HOME :Java安装目录 * TEMP :用户临时文件目录 * SystemDrive :系统盘符 * ProgramFiles :默认程序目录 * USERDOMAIN :帐户的域的名称 * ALLUSERSPROFILE :用户公共目录 * SESSIONNAME :Session名称 * TMP :临时目录 * Path :path环境变量 * CLASSPATH :classpath环境变量 * PROCESSOR_ARCHITECTURE :处理器体系结构 * OS :操作系统类型 * PROCESSOR_LEVEL :处理级别 * COMPUTERNAME :计算机名 * Windir :系统安装目录 * SystemRoot :系统启动目录 * USERNAME :用户名 * ComSpec :命令行解释器可执行程序的准确路径 * APPDATA :应用程序数据目录 * @return */ public static String getEnvironmentVariable(String variableName){ Map enviromentProperties = System.getenv(); return (String) enviromentProperties.get(variableName); } public Map getVariables(String variableName){ Map resultMap = new HashMap(); String systemProperty = getSystemProperty(variableName); resultMap.put(SYSTEM_PROPERTY_PARAM, systemProperty); String environmentVariable = getEnvironmentVariable(variableName); resultMap.put(ENVIRONMENT_VARIABLE_PARAM, environmentVariable); //解析 args String argsValue = null; String[] args = applicationArguments.getSourceArgs(); if(!ObjectUtils.isEmpty(args)){ for(int i = 0; i < args.length; i++){ if(args[i].toLowerCase().contains(variableName.toLowerCase())){ argsValue = args[i]; } } } resultMap.put(ARGS_PARAM, argsValue); /** * 解析选项参数 * @description * 1. 不同框架 对 args 的解析策略均不同。例如 Flink 的 ParameterTool 与 SpringBoot 的 DefaultApplicationArguments,解析规则和解析结果有很大差异 * 1. 基于 SpringBoot 的 ApplicationArguments 接口, DefaultApplicationArguments 。 如果是以”--“为前缀,则判定为选项参数;反之,被判定为 非选项参数 * @sample * [1] 选项参数的有效示例 * --foo * --foo= * --foo="" * --foo=bar * --foo="bar then baz" * --foo=bar,baz,biz * [2] 选项参数的无效示例 * -foo * --foo bar * --foo = bar * --foo=bar --foo=baz --foo=biz */ List optionArgs = applicationArguments.getOptionValues(variableName);// args = { "--foo="bar then baz" } , variableName = "foo" => optionArgs = {"bar then baz"} resultMap.put(OPTION_ARG_PARAM, optionArgs); List allNonOptionArgs = applicationArguments.getNonOptionArgs();// { "server.port=8089" , "server.port=8090", "boo=bar,then,baz" , "foo=bar then baz" } List nonOptionArgs = new ArrayList(); for(int i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3