使用maven的profile构建不同环境配置的方法

 更新时间:2021年1月26日 19:46  点击:2608

最近使用到了maven的profile功能,发现这个功能的确很好用也很实用,这块的知识比较多也比较乱,其实真正理解了之后非常简单,为了巩固总结知识,有个更清晰的知识体系,本文诞生了,希望能让像我一样零基础的小白一看就懂,有请戏精,闪亮登场~~

1.背景

作为一名猿,在实际的项目开发中,通常会有很多配置环境,比如最基本的:开发、测试、生产;不同的环境,某些文件的配置是不一样的(如:数据库连接信息、properties文件的配置等),如果我们进行开发or测试时每次都得手动去修改配置文件,难免有些麻烦且容易出现问题(我反正是深有体会╥﹏╥),所以,当当当当~maven的profile功能就出现了。

2.Profile简介

简单说一下,maven的profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的目的。

3.Profile在哪定义

一般来讲,有三种地方可以定义,不同的地方,作用范围不同,可配置项也不同;

  • 针对于特定项目的profile配置,我们可以定义在该项目的pom.xml中。
  • 针对于特定用户的profile配置,我们可以在用户的settings.xml文件中定义profile。该文件在用户目录下的“.m2”目录下。
  • 全局的profile配置。全局的profile是定义在Maven安装目录下的“conf/settings.xml”文件中的。

4.Profile使用实例

ps:前方将使用Eclipse来演示,主要以pom配置为主,重点涉及到了profile、filter、resource标签,工程源代码在文章最末尾。

过多的理论就不再说了,还是配合着实例代码来看更容易理解一些。另外,构建不同的环境配置主要有两种效果(或者叫实现方式):
- 第一种,根据不同的环境生成不同的配置文件(profile+resources);
- 第二种,根据不同的环境生成不同的配置内容,并替换原配置文件中的内容(profile+resources+filters);

什么意思?可能比较抽象,别捉急,我们一个一个演示。哦对了,先放一张项目结构图尝尝鲜(为了结构更清晰,我把单元测试的包删了):

这里写图片描述

4.1 生成不同配置文件

本实例达到的效果是:根据不同的环境,动态打包生成不同环境下的 db.properties 文件。

(1)在pom.xml中的project节点下配置profile

 <profiles>
  <!-- 开发 -->
  <profile>
   <!-- profile的id -->
   <id>dev</id>
   <properties>
    <!-- 此处的jastar.env可以自定义,其他地方可以使用${jastar.env}来引用此属性 -->
    <jastar.env>dev</jastar.env>
   </properties>
   <activation>
    <!-- 默认激活此配置 -->
    <activeByDefault>true</activeByDefault>
   </activation>
  </profile>
  <!-- 测试 -->
  <profile>
   <id>test</id>
   <properties>
    <jastar.env>test</jastar.env>
   </properties>
  </profile>
  <!-- 生产 -->
  <profile>
   <id>prd</id>
   <properties>
    <jastar.env>prd</jastar.env>
   </properties>
  </profile>
 </profiles>

(2)建立三种环境的资源文件夹,如下:

src/main/filters/dev
src/main/filters/test
src/main/filters/prd

并添加各自的db.properties文件:

这里写图片描述

注意:maven标准目录中,提供了一个filters目录用于存放资源过滤文件。推荐在filters目录下创建,而不是resources目录,因为resources目录中的文件默认情况下是不会被过滤的,还需在resources节点下额外的配置一些东西;这样的话结构也较清晰,resource目录存放公共资源文件,filters目录存放不同环境差异化资源文件。

(3)配置maven-resources-plugin插件

在构建WAR包的时候会经过资源文件处理阶段,maven-resources-plugin 则用来处理资源文件。在pom.xml中的build节点下配置如下:

<plugins>
 <!-- 编译插件,此处用来设置jdk的版本,否则默认的版本很低 -->
 <plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
   <source>1.7</source>
   <target>1.7</target>
   <encoding>UTF-8</encoding>
  </configuration>
 </plugin>
 <!-- 资源文件处理插件,必须配置 -->
 <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <configuration>
   <encoding>UTF-8</encoding>
  </configuration>
 </plugin>
</plugins>

(4)配置resources节点

在pom.xml中的build节点下配置如下:

<!-- 最后生成的资源文件 -->
<resources>
 <!-- 所有公共资源文件 -->
 <resource>
  <directory>src/main/resources</directory>
 </resource>
 <!-- 不同环境的资源文件 -->
 <resource>
  <directory>src/main/filters/${jastar.env}</directory>
 </resource>
</resources>

(5)打包测试

至此,配置已经完成了,细心的童鞋会发现,我们maven update 项目之后,资源目录会出现以下现象:

这里写图片描述 

没错,这说明我们的配置生效了,因为默认的profile是dev,所以Eclipse会智能的把该目录显示在这里。

好,接下来打包测试一下是否达到了我们的预期效果。右键项目Run AS,如下:

这里写图片描述 

填写maven命令后run:

这里写图片描述 

运行完成刷新项目可以看到,target目录下生成了“demo-maven-profile.war”文件,打开文件可以看到生成的属性文件如下:

这里写图片描述 

查看db.properties文件内容,perfect~当然,你们也可以试试指定其他profile,在此不再演示。

这里写图片描述

4.2 注入不同的配置内容

本实例达到的效果是:根据不同的环境,将 src/main/resources/log4j.properties中的部分内容替换为src/main/filters/dev、test、prd/log4j.properties中的内容。

(1)依然是先配置profile,上面已经配置过了,同上。
(2)新建src/main/resources/log4j.properties文件如下:

这里写图片描述 

(3)新建src/main/filters/dev、test、prd/log4j.properties文件如下:

这里写图片描述 

(4)重点来了,在pom.xml的build节点下配置filters节点和resources节点,如下(注意注释部分):

<!-- 此处定义变量配置文件地址 -->
<filters>
 <!-- 注意如果配置了多个filter,并且他们包含有相同的key,则以后面的value为最终值 -->
 <filter>src/main/filters/${jastar.env}/log4j.properties</filter>
</filters>
<resources>
 <resource>
  <directory>src/main/resources</directory>
  <!-- 这句配置是关键,表示该资源文件夹下要进行过滤操作 -->
  <filtering>true</filtering>
 </resource>
 <resource>
  <directory>src/main/filters/${jastar.env}</directory>
 </resource>
</resources>

(5)打包测试

配置完成,接下来同样以上面的方式打包,这里我的profile填写test,运行完成,打开war包,查看log4j.properties文件如下,可以看到log4j的部分内容被替换了,实验成功!

这里写图片描述

5.扩展

5.1 Profile的激活方式

1. 使用 activeByDefault 设置激活

在以上的实例中,我们使用了以下方式设置了默认激活:

<activation> 
 <activeByDefault>true</activeByDefault> 
</activation>

2. 在 settings.xml 中使用 activeProfiles 指定激活

profile配置如下:

<profiles> 
 <profile> 
  <id>profile1</id> 
  <properties> 
   <hello>lilei</hello> 
  </properties> 
 </profile> 

 <profile> 
  <id>profile2</id> 
  <properties> 
   <hello>hanmeimei</hello> 
  </properties> 
 </profile> 
</profiles>

激活如下(支持多个):

<activeProfiles> 
 <activeProfile>profile1</activeProfile> 
</activeProfiles> 

3. 在maven命令中使用参数显示激活

Eclipse窗口式运行帮我们隐藏了很多东西,其实原始的 maven 命令应该是这样写的:

mvn clean package –Pprofile1 

当然,也可以取消激活:

mvn clean package –P!profile1 

还有激活多个:

mvn clean package -Pprofile1,profile2,!profile3

4. 根据环境来激活

profile一个非常重要的特性就是它可以根据不同的环境来激活,比如根据jdk的版本:

<!-- 如果jdk的版本为1.8则激活该profile -->
<profiles>
 <profile>
  <id>profile1</id>
  <activation>
   <jdk>1.8</jdk>
  </activation>
 </profile>
</profiles>

根据操作系统:

<profiles>
 <profile>
  <id>profile1</id>
  <activation>
   <os>
    <!-- 不必指定所有信息 -->
    <name>linux</name>
    <family>unix</family>
    <arch>amd64</arch>
    <version>3.19.0-30-generic</version>
   </os>
  </activation>
 </profile>
</profiles>

根据环境变量:

<profiles>
 <profile>
  <id>profile1</id>
  <activation>
   <property>
    <name>debug</name>
    <value>true</value>
   </property>
  </activation>
 </profile>
</profiles>

根据文件是否存在来激活:

<profiles>
 <profile>
  <id>profile1</id>
  <activation>
   <file>
    <missing>/path/to/missing/file</missing>
    <exists>/path/to/exists/file</exists>
   </file>
  </activation>
 </profile>
</profiles>

不同类型的激活方式可以组合使用,但是只有但两个条件都匹配时才能激活。

5.2 关于Filter

Filter 是 maven 的 resource插件提供的功能,作用是用环境变量、pom文件里定义的属性和指定配置文件里的属性替换属性(*.properties)文件里的占位符(${jdbc.url})。

src/main/resources目录有个配置文件jdbc.properties,内容如下:

jdbc.url=${pom.jdbc.url}
jdbc.username=${pom.jdbc.username}
jdbc.passworkd=${pom.jdbc.password}

配置 resource 插件,启用filtering功能并添加属性到pom:

<project>
 ...
 <!-- 用pom里定义的属性做替换 -->
 <properties>
  <pom.jdbc.url>jdbc:mysql://127.0.0.1:3306/dev</pom.jdbc.url>
  <pom.jdbc.username>root</pom.jdbc.username>
  <pom.jdbc.password>123456</pom.jdbc.password>
 </properties>
 <build>
  ...
  <!-- 可以把属性写到文件里,用属性文件里定义的属性做替换 -->
  <filters>
   <filter>src/main/filters.properties</filter>
  </filters>
  <resources>
   <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
   </resource>
  </resources>
  ...
 </build>
 ...
</project>

编译包后 target 目录下的 jdbc.properties :

jdbc.url=jdbc:mysql://127.0.0.1:3306/dev
jdbc.username=root
jdbc.passworkd=123456

文章到这里就差不多了,最后,为各位小伙伴默默奉上源代码:传送门

到此这篇关于使用maven的profile构建不同环境配置的方法的文章就介绍到这了,更多相关maven profile构建不同环境配置内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • 解决执行maven命令时提示Process terminated的问题

    这篇文章主要介绍了解决执行maven命令时提示Process terminated的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-25
  • 解决idea2020 maven无法自动导包的问题

    这篇文章主要介绍了解决idea2020 maven无法自动导包的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-13
  • 解决IDEA maven 项目修改代码不生效,mvn clean、install后才生效

    这篇文章主要介绍了解决IDEA maven 项目修改代码不生效,mvn clean、install后才生效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-25
  • idea 打包maven项目忽略test文件的操作

    这篇文章主要介绍了idea 打包maven项目忽略test文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-05
  • 详解Maven profile配置管理及激活profile的几种方式

    这篇文章主要介绍了详解Maven profile配置管理及激活profile的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-26
  • 详解idea从git上拉取maven项目详细步骤

    这篇文章主要介绍了详解idea从git上拉取maven项目详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-12
  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16
  • 带你了解Java Maven的打包操作

    这篇文章主要介绍了Maven打包的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-13
  • idea2020.3配置maven环境并配置Tomcat的详细教程

    这篇文章主要介绍了idea2020.3配置maven环境并配置Tomcat的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-19
  • 使用maven的profile构建不同环境配置的方法

    这篇文章主要介绍了使用maven的profile构建不同环境配置的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-26
  • idea+maven打jar包的两种方式

    这篇文章主要介绍了idea+maven打jar包的两种方式,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-16
  • maven 在执行package,install,deploy时使用clean与不使用clean的不同之处

    有时候用mvn install后,新改的内容不生效,一定要后来使用mvn clean install 才生效,由于之前没有做记录,以及记不清是什么情况下才会出现的问题,于是想看看clean和不clean的区别,感兴趣的朋友跟随小编一起看看吧...2021-08-03
  • 使用maven开发springboot项目时pom.xml常用配置(推荐)

    这篇文章主要介绍了使用maven开发springboot项目时的pom.xml常用配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-08
  • idea克隆maven项目的方法步骤(图文)

    这篇文章主要介绍了idea克隆maven项目的方法步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-05
  • 基于maven的三种packaging方式

    这篇文章主要介绍了maven的三种packaging方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-01
  • 解决IDEA无法下载maven依赖的问题

    这篇文章主要介绍了解决IDEA无法下载maven依赖的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-04
  • Maven中央仓库正式成为Oracle官方JDBC驱动程序组件分发中心(推荐)

    这篇文章主要介绍了Maven中央仓库正式成为Oracle官方JDBC驱动程序组件分发中心,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-12-08
  • 如何将tomcat源码以maven方式运行

    这篇文章主要介绍了如何将tomcat源码以maven方式运行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
  • maven工程中jar包瘦身的五种方法

    这篇文章主要介绍了maven工程中jar包瘦身的五种方法,帮助大家更好的理解和使用maven,感兴趣的朋友可以了解下...2021-02-06
  • MAVEN的安装配置与IDEA整合超详细教程

    这篇文章给大家介绍了MAVEN的安装,配置与IDEA整合方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,感兴趣的朋友跟随小编一起看看吧...2021-02-06