【SpringBoot】配置文件及启动参数

227 阅读5分钟

YML配置

SpringBoot使用一个全局的配置文件,配置文件名称是固定的,支持两种文件格式:

  • application.properties

    • 语法结构:key=value
  • application.yml

    • 语法结构:key:空格value

配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;

比如我们可以在配置文件中修改Tomcat默认启动的端口号!测试一下!

server.port=8081

YAML概述

YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)

这种语言以数据作为中心,而不是以标记语言为重点!

以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yamlxml

传统xml配置:

<server>
    <port>8081<port>
</server>

yaml配置:

server:
  prot: 8080

YAML基础语法

说明:语法要求严格!

  1. 空格不能省略
  2. 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
  3. 属性和值的大小写都是十分敏感的。

字面量:普通的值[数字,布尔值,字符串]

字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号;

k: v

注意:

  • “ ”双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思;
    比如:name:"kuang \n shen" 输出:kuang 换行 shen
  • ''单引号,会转义特殊字符,特殊字符最终会变成和普通字符一样输出
    比如:name:‘kuang \n shen’ 输出:kuang \n shen

对象、Map(键值对)

#对象、Map格式
k:
  v1:
  v2:

在下一行来写对象的属性和值得关系,注意缩进;比如:

student:
  name: qinjiang
  age: 3

行内写法

student: {name: qinjiang,age: 3}

数组(List、set)

-值表示数组中的一个元素,比如:

pets:
 - cat
 - dog
 - pig

行内写法

pets: [cat,dog,pig]

修改SpringBoot的默认端口号

配置文件中添加,端口号的参数,就可以切换端口;

server:
  port: 8082

yml配置文件

server:
  port: 8080

my:
  name: demo

spring:
  profiles:
    active: dev

---
#development environment
spring:
  profiles: dev

server:
  port: 8160

my:
  name: ricky

---
#test environment
spring:
  profiles: test

server:
  port: 8180

my:
  name: test

---
#production environment
spring:
  profiles: prod

server:
  port: 8190

my:
  name: prod

application.yml文件分为四部分,使用---来做为分隔符,第一部分通用配置部分,表示三个环境都通用的属性,后面三段分别为:开发,测试,生产,用spring.profiles指定了一个值(开发为dev,测试为test,生产为prod),这个值表示该段配置应该用在哪一个profile里面。

若是本地启动,在通用配置里面能够设置调用哪一个环境的profile,也就是第一段的spring.profiles.active=XXX,其中XXX是后面3段中spring.profiles对应的value,经过这个就能够控制本地启动调用哪一个环境的配置文件,例如:服务器

spring:
  profiles:
    active: dev

表示默认加载的就是开发环境的配置,若是dev换成test,则会加载测试环境的属性,以此类推。

注意:若是spring.profiles.active没有指定值,那么只会使用没有指定spring.profiles文件的值,也就是只会加载通用的配置。

启动参数

Java启动jar命令:

java [ options ] -jar file.jar [ arguments ]

Java HotSpot VMs针对,当前运行时环境,提供了一套调准的options

-Dproperty=value

Sets a system property value. If value is a string that contains spaces, then you must enclose the string in double quotation marks:
java -Dmydir="some string" SomeClass

大意是:如果值是包含空格的字符串,则必须用双引号将该字符串括起来。

以下几种方式都可以被@Value读取到

1、-D 系统属性注入

java -jar -Dserver.port=8888 -Xms1024m demo.jar

-D(defintion)表示自定义参数

这种方式增加的参数是被设置到应用的系统属性中,可以使用System.getProperty(“server.port”)获取(可以在idea的idea VM options中配置,以空格分隔)

注意:-D参数必须在jar包之前。

2、属性赋值

在用命令行方式启动springBoot应用时,连续的两个减号--就是对application.properties中的属性值进行赋值的标识。所以,java -jar xxx.jar --server.port=8888命令,等价于application.properties中添加属性server.port=8888

java -jar demo.jar --server.port=8888

这种方式增加的参数是属于命令行参数,即会从springboot启动时的main方法的String[] args中作为参数传入(可以在ideaprogram arguments中配置,以空格分隔)

注意:

  1. –属性赋值若在-jar之前,则脚本错误,无法启动。
    日志肯定不会打印,因为系统起不来。可以在最后设置转向输出: > ./server.out 2>&1 &
#无法识别的选项
Unrecognized option: --spring.profiles.active=sit
#错误:无法创建Java虚拟机。
Error: Could not create the Java Virtual Machine.
#错误:发生致命异常。程序将退出。
Error: A fatal exception has occurred. Program will exit.
  1. –属性赋值为linux的shell内部命令,朋友说的,暂未证实。目前测试来看,–只能放在-jar后,对相应属性赋值。
  2. -D为Java内部命令,必须放在-jar前,在其后则无效。
  3. 目前来看,既然-D和–都能实现属性注入,最好还是使用spring自带的-D。
  4. 最终启动命令修改如下,(为了方便展示,中间有回车,若使用记得去除)。
    一般来讲,启动命令注入的参数基本为不变参数,类似于UTF-8这种格式设置。
    -Dapollo这种ip配置变更可能性大,最好还是放在jar包同级目录config文件夹下。
nohup java  -Xmx512m -Xms512m -Xss512k -XX:MaxDirectMemorySize=1G -XX:+UseG1GC 
-XX:MaxGCPauseMillis=200 -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=40
-XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC
 -XX:-OmitStackTraceInFastThrow -XX:+PrintCommandLineFlags -XX:+UnlockCommercialFeatures
 -XX:+FlightRecorder -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8
 -Dapollo.meta=http://10.7.xxx.1x2:7080 -jar ./$appName > ./server.out 2>&1 &

–属性赋值若在-jar之前,则脚本错误,无法启动。

3、从操作系统的环境变量中读取

这种方式的参数即属于操作系统方面的,比如安装jdk时设置的环境变量,定义JAVA_HOME,也可以通过System.getenv(“JAVA_HOME”)获取,(可以在idea的VM Environment variables中配置,以;分隔)

4、通过项目中配置文件bootstrap/application文件载入

这种方式是在项目中配置的方式,比较常见