是不是还傻傻分不清参数配置到底怎么写,写在哪个位置,那么这篇文章就让你学会。

目录

1、Program arguments

2、VM options

3、Environment variables

最佳实践


打开 IDEA 的 Run Configuration,可以看到以下参数配置

  • VM options
  • Program arguments
  • Environment variables

java 查询参数改成数组 java查看参数类型_jvm

1、Program arguments

Program arguments:程序参数,用于设置当前程序的参数

配置方式

在 jar 文件后面直接进行配置,参数以空格分隔,构成一个参数数组

java -jar nacos.jar hello world

取值方式

可以从 main 方法的 args 参数中拿到数据

public static void main(String[] args) {
    System.out.println("获取到的值是: " + Arrays.toString(args));
}

再来看看一段 SpringBoot 程序

@SpringBootApplication
public class MyApp {

    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

这段代码里,SpringBoot 对 main 方法的 args 参数进行了接收

那用 args 做了什么呢?

下面我摘出关键代码 解析参数

这是一段解析 args 数组的方法,位置在 

org.springframework.core.env.SimpleCommandLineArgsParser#parse

java 查询参数改成数组 java查看参数类型_java 查询参数改成数组_02

 这段代码做的事情就是对参数进行解析,将结果存储在内部的 map 或 list 中。

假设如下参数

java -jar app.jar --user=张三 --user=李四 --class=计算机课 room=516

结果如下

java 查询参数改成数组 java查看参数类型_java 查询参数改成数组_03

可以看出对于 -- 开头的参数

存储到了 CommandLineArgs 的 optionArgs 中,否则就存储在 nonOptionArgs 中。

而对于 optionArgs 相同的 key ,其 value 会以列表的形式放在一起。

也就是说,Spring 将 程序参数进行了解析并存了起来,这样就可以实现通过 程序参数 来改变 Spring 行为功能了。

由于本文的重点不是 Spring,所以不探讨 Spring 内部如何流转处理这些参数的。

2、VM options

这个是 JVM 虚拟机级别的参数,配置该参数可以调整当前 JVM 实例的行为。

常见的参数配置有  -Xms4G -Xmx4G -Xmn2G ... 

-D 参数用来额外增加一些配置项。

格式为:-Dkey=value

配置方式

注意 -D 参数是跟在 java 后面的

java -Dnacos.standalone=true -jar nacos.jar

取值方式

String value = System.getProperty("nacos.standalone")

除了可以自己设置参数外,VM options 也有内置的参数。

java 查询参数改成数组 java查看参数类型_java 查询参数改成数组_04

 以上参数都可以通过 System.getProperty(name) 方法拿到。

3、Environment variables

Environment variables 代表系统环境参数

配置方式

Windows

java 查询参数改成数组 java查看参数类型_jvm_05

 Linux 

vim /etc/profile 

source /etc/profile

取值方式

System.getenv(key)

java 查询参数改成数组 java查看参数类型_jar_06

 另外,可通过   Map<String, String> envs = System.getenv()  拿到全部参数。

java 查询参数改成数组 java查看参数类型_java 查询参数改成数组_07

最佳实践

1. 对于账号密码等敏感信息使用 系统环境变量方式 Environment variables

例如数据库连接地址、账号,我们就可以配置在系统环境变量里,开发人员将无法得知真实的账号,增加了安全性。(除非他有服务器权限)

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: ${MYSQL-USER:user}
      password: ${MYSQL-PWD:123456}
      url: jdbc:mysql://${MYSQL-HOST:localhos}:${MYSQL-PORT:3306}/${MYSQL-DB:test}

2. 使用 程序参数 改变 SpringBoot 应用行为

例如常见的不同环境

java -jar user.jar --spring.profiles.active=test

java -jar user.jar --spring.profiles.active=prod

这样就不需要改变代码了。

当然如果某台服务器专门是测试或生产服务器,就可以直接把它配置为 系统环境变量。