是不是还傻傻分不清参数配置到底怎么写,写在哪个位置,那么这篇文章就让你学会。
目录
1、Program arguments
2、VM options
3、Environment variables
最佳实践
打开 IDEA 的 Run Configuration,可以看到以下参数配置
- VM options
- Program arguments
- Environment variables
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
这段代码做的事情就是对参数进行解析,将结果存储在内部的 map 或 list 中。
假设如下参数
java -jar app.jar --user=张三 --user=李四 --class=计算机课 room=516
结果如下
可以看出对于 -- 开头的参数
存储到了 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 也有内置的参数。
以上参数都可以通过 System.getProperty(name) 方法拿到。
3、Environment variables
Environment variables 代表系统环境参数
配置方式
Windows
Linux
vim /etc/profile
source /etc/profile
取值方式
System.getenv(key)
另外,可通过 Map<String, String> envs = System.getenv() 拿到全部参数。
最佳实践
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
这样就不需要改变代码了。
当然如果某台服务器专门是测试或生产服务器,就可以直接把它配置为 系统环境变量。