1. Maven多环境配置与应用
1.1 多环境开发
-
我们平常都是在自己的开发环境进行开发,
-
当开发完成后,需要把开发的功能部署到测试环境供测试人员进行测试使用,
-
等测试人员测试通过后,我们会将项目部署到生成环境上线使用。
-
这个时候就有一个问题是,不同环境的配置是不相同的,如不可能让三个环境都用一个数据库,所以就会有三个数据库的url配置,
-
我们在项目中如何配置?
-
要想实现不同环境之间的配置切换又该如何来实现呢?
maven提供配置多种环境的设定,帮助开发者在使用过程中快速切换环境。具体实现步骤:
步骤1:父工程配置多个环境,并指定默认激活环境
<profiles>
<!--开发环境-->
<profile>
<id>env_dep</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
<!--设定是否为默认启动环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--生产环境-->
<profile>
<id>env_pro</id>
<properties>
<jdbc.url>jdbc:mysql://127.2.2.2:3306/ssm_db</jdbc.url>
</properties>
</profile>
<!--测试环境-->
<profile>
<id>env_test</id>
<properties>
<jdbc.url>jdbc:mysql://127.3.3.3:3306/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
其中,
<activation>
<activeByDefault>true</activeByDefault>
</activation>
用来设定是否为默认启动环境。
步骤2:执行安装查看env_dep(开发)环境是否生效
双击maven中的install---->查看下载好的zip中的WEB-INF中的配置文件中的url信息。
步骤3:切换默认环境为生产环境
<!--生产环境-->
<profile>
<id>env_pro</id>
<properties>
<jdbc.url>jdbc:mysql://127.2.2.2:3306/ssm_db</jdbc.url>
</properties>
<!--设定是否为默认启动环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
步骤4:执行安装并查看env_pro环境是否生效
同步骤三。
那么,问题来了!!!
我们虽然已经能够实现不同环境的切换,但是每次切换都是需要手动修改,如何来实现在不改变代码的前提下完成环境的切换呢?
接下来:::
步骤5:命令行实现环境切换
点击M图标,在命令行中输入命令:
mvn install -P env_test
其中, -P 参数用于激活一个或多个构建配置文件(profiles)。Maven 的构建配置文件允许你定义一组特定的配置设置,这些设置可以在构建的不同阶段或环境中使用。
步骤6:执行安装并查看env_test环境是否生效
此步骤便不在描述。
2.SpringBoot多环境配置
以后在工作中,对于开发环境、测试环境、生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql
,连接自己电脑上的 mysql
即可,但是项目开发完毕后要上线就需要该配置,将环境的配置改为线上环境的。
来回的修改配置会很麻烦,而 SpringBoot
给开发者提供了多环境的快捷配置,需要切换环境时只需要改一个配置即可。不同类型的配置文件多环境开发的配置都不相同,接下来对不同类型的配置文件进行说明。
2.1 yaml文件
在 application.yml
中使用 --- 来分割不同的配置,内容如下
#开发
spring:
profiles: dev #给开发环境起的名字
server:
port: 80
---
#生产
spring:
profiles: pro #给生产环境起的名字
server:
port: 81
---
#测试
spring:
profiles: test #给测试环境起的名字
server:
port: 82
---
上面配置中 spring.profiles
是用来给不同的配置起名字的。而如何告知 SpringBoot
使用哪段配置呢?可以使用如下配置来启用一段配置
#设置启用的环境
spring:
profiles:
active: dev #表示使用的是开发环境的配置
综上所述,完整的yaml文件如下:
#设置启用的环境
spring:
profiles:
active: dev
---
#开发
spring:
profiles: dev
server:
port: 80
---
#生产
spring:
profiles: pro
server:
port: 81
---
#测试
spring:
profiles: test
server:
port: 82
注意:在上面配置中给不同配置起名字的 spring.profiles
配置项已经过时。最新用来起名字的配置项是
#开发
spring:
config:
activate:
on-profile: dev
2.2 properties文件
properties
类型的配置文件配置多环境需要定义不同的配置文件
-
application-dev.properties
是开发环境的配置文件。我们在该文件中配置端口号为80
server.port=80
-
application-test.properties
是测试环境的配置文件。我们在该文件中配置端口号为81
server.port=81
-
application-pro.properties
是生产环境的配置文件。我们在该文件中配置端口号为82
server.port=82
SpringBoot 只会默认加载名为 application.properties
的配置文件,所以需要在 application.properties
配置文件中设置启用哪个配置文件,配置如下:
spring.profiles.active=pro
2.3 命令行启动参数设置
使用 SpringBoot
开发的程序以后都是打成 jar
包,通过 java -jar xxx.jar
的方式启动服务的。那么就存在一个问题,如何切换环境呢?因为配置文件打到的jar包中了。
我们知道 jar
包其实就是一个压缩包,可以解压缩,然后修改配置,最后再打成jar包就可以了。这种方式显然有点麻烦,而 SpringBoot
提供了在运行 jar
时设置开启指定的环境的方式,如下
java –jar xxx.jar –-spring.profiles.active=test
那么这种方式能不能临时修改端口号呢?也是可以的,可以通过如下方式
java –jar xxx.jar –-server.port=88
当然也可以同时设置多个配置,比如即指定启用哪个环境配置,又临时指定端口,如下
java –jar springboot.jar –-server.port=88 –-spring.profiles.active=test
大家进行测试后就会发现命令行设置的端口号优先级高于配置文件中设置的端口号(也就是使用的是命令行设置的端口号)。
优先级从上到下递增。
如果使用了多种方式配合同一个配置项,优先级高的生效。
3. SpringBoot配置文件分类
有这样的场景,我们开发完毕后需要测试人员进行测试,由于测试环境和开发环境的很多配置都不相同,所以测试人员在运行我们的工程时需要临时修改很多配置,如下
java –jar springboot.jar –-spring.profiles.active=test --server.port=85 --server.servlet.context-path=/heima --server.tomcat.connection-timeout=-1 …… …… …… …… ……
测试内心OS:救命!!开发还能不能干了,不行让我来。。。。
针对这种情况,SpringBoot
定义了配置文件不同的放置位置;而放在不同位置的优先级时不同的。
SpringBoot
中4级配置文件放置位置:
-
1级:classpath:application.yml
-
2级:classpath:config/application.yml
-
3级:file :application.yml
-
4级:file :config/application.yml
说明:级别越高优先级越高
3.1 验证1级和2级的优先级
在 resources
下创建一个名为 config
的目录,在该目录中创建 application.yml
配置文件,而在该配置文件中将端口号设置为 81
,内容如下
server:
port: 81
而在 resources
下创建的 application.yml
配置文件中并将端口号设置为 80
,内容如下
server:
port: 80
运行启动引导类,------>类路径下的 config
下的配置文件优先于类路径下的配置文件------>2级:classpath:config/application.yml > 1级:classpath:application.yml
注意:
1.在类路径(classpath:
)上的application.yml
(或.properties
)文件将具有比文件系统上的文件更低的优先级。
2. 默认位置(从高到低):
-
当前目录下的
config
子目录 -
当前目录
-
类路径上的
/config
包 -
类路径的根目录
例如:
-
3级:file:application.yml:这通常指的是当前工作目录下的
application.yml
文件。在默认位置列表中,它的优先级低于config
子目录下的配置文件,但高于类路径上的配置文件。 -
4级:file:config/application.yml:这指的是当前工作目录下的
config
子目录中的application.yml
文件。在默认位置列表中,它的优先级是最高的,因为它位于搜索路径的最前面。
4.Maven 跳过测试
前面在执行install
指令的时候,Maven都会按照顺序从上往下依次执行,每次都会执行test
,
遇到一些爆红的信息,小伙伴们是不是很烦!!!命名没出错,还是红色--是不是故意吓唬我.......
所以,我们可以采取一些措施'强暴'的把他们干掉。
对于test
来说有它存在的意义,
-
可以确保每次打包或者安装的时候,程序的正确性,假如测试已经通过在我们没有修改程序的前提下再次执行打包或安装命令,由于顺序执行,测试会被再次执行,就有点耗费时间了。
-
功能开发过程中有部分模块还没有开发完毕,测试无法通过,但是想要把其中某一部分进行快速打包,此时由于测试环境失败就会导致打包失败。
遇到上面这些情况的时候,我们就想跳过测试执行下面的构建命令,具体实现方式有很多:
方式一:IDEA工具实现跳过测试
图中的按钮为Toggle 'Skip Tests' Mode
,
Toggle翻译为切换的意思,也就是说在测试与不测试之间进行切换。
点击一下,出现测试画横线的图片,如下:
说明测试已经被关闭,再次点击就会恢复。
这种方式最简单,但是有点"暴力",会把所有的测试都跳过,如果我们想更精细的控制哪些跳过哪些不跳过,就需要使用配置插件的方式。
方式二:配置插件实现跳过测试
在父工程中的pom.xml中添加测试插件配置
<build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.12.4</version> <configuration> <skipTests>false</skipTests> <!--排除掉不参与测试的内容--> <excludes> <exclude>**/BookServiceTest.java</exclude> </excludes> </configuration> </plugin> </plugins> </build>
skipTests:如果为true,则跳过所有测试,如果为false,则不跳过测试
excludes:哪些测试类不参与测试,即排除,针对skipTests为false来设置的
includes: 哪些测试类要参与测试,即包含,针对skipTests为true来设置的
方式三:命令行跳过测试
使用Maven的命令行,mvn 指令 -D skipTests
mvn 指令(install/package...) -D skipTests
注意事项:
-
执行的项目构建指令必须包含测试生命周期,否则无效果。例如执行compile生命周期,不经过test生命周期。
-
该命令可以不借助IDEA,直接使用cmd命令行进行跳过测试,需要注意的是cmd要在pom.xml所在目录下进行执行。