Maven多环境与SpringBoot多环境配置

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所在目录下进行执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring中用到的设计模式有哪些

工厂模式,BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象。 单例模式,Spring依赖注入Bean实例默认是单例的。Spring依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创…

手写8大排序算法Java版

如何手写8大排序算法&#xff1a;从入门到精通 排序算法是计算机科学中最基本的算法之一&#xff0c;几乎所有编程语言的面试都会涉及到排序算法的问题。掌握排序算法不仅能够帮助你更好地理解数据结构和算法&#xff0c;还能提升你解决实际问题的能力。本文将带你从零开始&am…

VSCode调试Typescript

目录 背景介绍安装运行问题提示没有npm或者tsc命令提示tsc : 无法加载文件ts-debugObject.defineProperty(exports, __esModule, { value: true })调试时自动断点 背景介绍 由于近期要涉及鸿蒙相关的功能&#xff0c;之前没有接触过TS这个语言&#xff0c;所以想要熟悉一下。 …

Unity曲线插件Dreamteck Splines生成曲线Mesh

一、需求 脱离编辑器&#xff0c;运行时添加点&#xff0c;动态生成管道、线缆等曲线Mesh。 二、Dreamteck Splines简单运用 这方面资料不多&#xff0c;只有官方文档全英参考&#xff0c;而且又介绍得不详细。 2个重要组件介绍&#xff1a; SplineComputer&#xff1a; 最…

yum、rpm相关命令-工具手册

1.rpm文件: 1.1安装rpm文件: rpm -ivh kde-select.rpm23 #--nodeps强制安装,无视环境缺少依赖的检查 rpm -ivh --nodeps kde-select.rpm #--force --replacefiles可以无视rpm的冲突去强制替换(如两个rpm的安装路径相同了会有冲突) rpm -ivh --nodeps --force --replacef…

设计模式——备忘录模式(Memento)

备忘录模式&#xff08;Memento Pattern&#xff09;&#xff0c;也称为快照模式或Token模式&#xff0c;是GoF&#xff08;Gang of Four&#xff0c;四位设计模式专家&#xff09;提出的23种设计模式之一&#xff0c;属于行为模式。该模式的主要目的是在不破坏封装性的前提下&…

springboot中mybatisplus注意事项

使用代码生成工具CodeGenerator 需要修改的内容 dsc.setUsername(“root”); mysql账号dsc.setPassword(“root”); mysql密码strategy.setInclude(“crm_edu”); 表名pc.setModuleName(“eduservice”); //模块名 package com.test.demo;import com.baomidou.mybatisplus.a…

【超详细】跑通YOLOv8之深度学习环境配置2

环境配置2下载安装内容如下&#xff1a; CUDA&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive cudnn&#xff1a;https://developer.nvidia.com/rdp/cudnn-archive 版本&#xff1a;CUDA11.3 cudnn8.9.7 CUDA安装 简介 CUDA&#xff08;Compute Unified De…

vue如何进行webpack的配置

Vue.js 项目通常使用 Vue CLI 来创建和管理&#xff0c;它内置了 Webpack 作为构建工具。然而&#xff0c;如果你想要手动配置 Webpack 或者有特定的需求&#xff0c;你也可以在 Vue 项目中直接进行 Webpack 的配置。 下面是一个简单的步骤&#xff0c;介绍如何在 Vue 项目中手…

使用Python创建一个简单的任务管理器应用程序

在这篇文章中&#xff0c;我们将探讨如何使用Python和Tkinter库来创建一个简单但功能强大的任务管理器应用程序。这个应用程序将允许用户添加、编辑、删除和完成任务&#xff0c;并提供一个直观的用户界面。 1. 设计用户界面 我们首先设计用户界面。我们将使用Tkinter库来创建…

SEO之为什么研究关键词(一)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a; 我给不会敲代码又想搭建网站的人建议 新手上云 初做网站的人很容易犯的最大错误之一是&#xff0c;脑袋一拍就贸然进入某个领域&#xff0c;跳过竞争研究&#xff0c;没规划好目标关键词就开始做网站。这样做…

一个递推通项公式研究

递推关系为a(n) ​pa(n−1) ​ qa(n−2) ​&#xff0c;本项前一项*2前前项&#xff0c;具体如 1&#xff0c;1&#xff0c;3&#xff0c;7&#xff0c;17&#xff0c;41&#xff0c;99&#xff0c;239&#xff0c;…… 一般的递推关系可以用以下方法 得两个解&#xff1a; …

python算法demo0512

最长回文数 代码 class Solution:def longestPalindrome(self, s: str) -> str:n len(s)if n < 2:return smax_len 1begin 0# dp[i][j] 表示 s[i..j] 是否是回文串dp [[False] * n for _ in range(n)]for i in range(n):dp[i][i] True# 递推开始# 先枚举子串长度fo…

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中&#xff0c;消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列&#xff08;Message Queue&#xff09;&#xff1a; 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时&#xff0c;系统会将生成的消息插入到消息队列中&…

cae仿真软件是啥

CAE&#xff08;Computer Aided Engineering&#xff09;仿真软件是一种专门用于工程设计和分析的软件&#xff0c;它集成了计算机科学、物理学、数学等多个领域的知识&#xff0c;能够对复杂的工程系统进行建模、仿真和分析。CAE软件通过数值计算和模拟技术&#xff0c;可以模…

十三、Redis哨兵模式--Sentinel

上一篇介绍了Redis中的主从复制。我们知道Redis主从中一般只有主节点对外提供写操作&#xff0c;如果主节点发生故障&#xff0c;为了保证Redis的可用性&#xff0c;这时就要在可用的slave节点中&#xff0c;挑选一个作为主节点。这种切换操作如果是人为的操作&#xff0c;那么…

支持播放h265的插件

插件源码地址&#xff1a;GitCode - 开发者的代码家园https://gitcode.com/mirrors/nanguantong/flv-h265.js/overview 1. 下载代码 运行以下命令 npm i npm run build npm run build 后生成 flv.min.js 文件&#xff0c;引入使用 2. 调用 js 文件&#xff1a; let flvj…

关于-RTSP推流方案, ffmpeg 视频转 m3u8

参考文章 https://zhuanlan.zhihu.com/p/668110375 增加fmpeg 执行单个视频推流 ffmpeg -re -stream_loop -1 -i 你视频的文件名 -c copy -f rtsp rtsp://127.0.0.1:8554/videohttps://blog.csdn.net/EthanCo/article/details/125321957 Windows下安装使用ffmpeg https://z…

uniapp开发小程序使用vue的v-html解析富文本图片过大过宽显示超过屏幕解决办法

如果没有设置的话&#xff0c;就会导致图片溢出&#xff0c;过宽显示或者错位显示&#xff0c;显示效果非常的丑陋&#xff1a; 修改后显示的效果&#xff1a; 网上比较low的解决办法&#xff1a;网上各种解决方法核心思想就是在数据层把数据模板上的img数据加上style样式&…

简要介绍三大脚本语言 Shell、Python 和 Lua

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 脚本语言是一种用于自动化操作系统任务和应用程序功能的编程语言。它们通常用于编写小到中等规模的程序&#xff0c;以提高任务执行的速度和效率。在众多脚本语言中&#xff0c;Shell、Python 和 Lua 是…