SpringBoot配置及命令注入
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来配置;比如一个简单的端口配置,我们来对比下yaml
和xml
传统xml
配置:
<server>
<port>8081<port>
</server>
yaml
配置:
server:
prot: 8080
YAML基础语法
说明:语法要求严格!
- 空格不能省略
- 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
- 属性和值的大小写都是十分敏感的。
字面量:普通的值[数字,布尔值,字符串]
字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号;
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
文件的值,也就是只会加载通用的配置。
MAVEN配置文件
打包时包含本地jar包
当maven项目里面有用到JDK内部的一些类,接口(如:com.sun.xml.internal.ws.spi.ProviderImpl)等的时候,用maven
编译一般会出现如下错误
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.105 s
[INFO] Finished at: 2019-07-05T12:45:49+08:00
[INFO] Final Memory: 21M/219M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project test: Compilation failure
[ERROR] /test/src/main/java/com/lk/Test.java:[7,36] 程序包com.sun.xml.internal.ws.spi不存在
[ERROR] -> [Help 1]
[ERROR]
解决方法如下:添加maven-compiler-plugin
插件,并且配置compilerArguments
。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<compilerArguments>
<!-- windows下使用分号(;)分隔,linux/mac下使用冒号(:)分隔 -->
<bootclasspath>
${java.home}/lib/rt.jar${path.separator}${java.home}/lib/jce.jar
</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
</plugins>
</build>
这样配置后,就能把本地配置的jar
包,发到服务器上,要不然执行mvn package
是不会把本地的jar
打包的。
注意:
- 这里的
rt.jar
需要配置正确的路径。 - 如果使用的类,接口等在其他的
jar
里面(如tools.jar
),则bootclasspath
值需要配置成其他的jar
。
启动参数
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
中作为参数传入(可以在idea
的program arguments
中配置,以空格分隔)
注意:
- –属性赋值若在-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.
- –属性赋值为linux的shell内部命令,朋友说的,暂未证实。目前测试来看,–只能放在-jar后,对相应属性赋值。
- -D为Java内部命令,必须放在-jar前,在其后则无效。
- 目前来看,既然-D和–都能实现属性注入,最好还是使用spring自带的-D。
- 最终启动命令修改如下,(为了方便展示,中间有回车,若使用记得去除)。
一般来讲,启动命令注入的参数基本为不变参数,类似于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文件载入
这种方式是在项目中配置的方式,比较常见
启动脚本
APP_NAME=app.jar
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist() {
pid=$(ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}')
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup java -jar $APP_NAME >/dev/null 2>&1 &
fi
}
#停止方法
stop() {
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart() {
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
启动脚本命令
# sh app.sh [start|stop|restart|status] 对用启动、停止、重启、查看状态
sh app.sh start