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来配置;比如一个简单的端口配置,我们来对比下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文件的值,也就是只会加载通用的配置。

MAVEN配置文件

POM标签大全详解

打包时包含本地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打包的。

注意:

  1. 这里的rt.jar需要配置正确的路径。
  2. 如果使用的类,接口等在其他的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中作为参数传入(可以在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文件载入

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

启动脚本

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
posted @ 2022-05-05 17:14  夏尔_717  阅读(395)  评论(0编辑  收藏  举报