怎么在maven中使用profile构建不同的环境
创始人
2024-12-29 08:44:46
0次

Profile在哪定义

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

  • 针对于特定项目的profile配置,我们可以定义在该项目的pom.xml中。

  • 针对于特定用户的profile配置,我们可以在用户的settings.xml文件中定义profile。该文件在用户目录下的“.m2”目录下。

  • 全局的profile配置。全局的profile是定义在Maven安装目录下的“conf/settings.xml”文件中的。

Profile使用实例

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

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

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

怎么在maven中使用profile构建不同的环境

生成不同配置文件

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

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

 
  
  
   
   dev
   
    
    dev
   
   
    
    true
   
  
  
  
   test
   
    test
   
  
  
  
   prd
   
    prd
   
  
 

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

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

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

怎么在maven中使用profile构建不同的环境

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

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

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


 
 
  maven-compiler-plugin
  
   1.7
   1.7
   UTF-8
  
 
 
 
  org.apache.maven.plugins
  maven-resources-plugin
  
   UTF-8
  
 

(4)配置resources节点

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



 
 
  src/main/resources
 
 
 
  src/main/filters/${jastar.env}
 

(5)打包测试

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

怎么在maven中使用profile构建不同的环境 

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

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

怎么在maven中使用profile构建不同的环境 

填写maven命令后run:

怎么在maven中使用profile构建不同的环境 

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

怎么在maven中使用profile构建不同的环境 

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

怎么在maven中使用profile构建不同的环境

4.2 注入不同的配置内容

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

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

怎么在maven中使用profile构建不同的环境 

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

怎么在maven中使用profile构建不同的环境 

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



 
 src/main/filters/${jastar.env}/log4j.properties


 
  src/main/resources
  
  true
 
 
  src/main/filters/${jastar.env}
 

(5)打包测试

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

怎么在maven中使用profile构建不同的环境

5.扩展

5.1 Profile的激活方式

1. 使用 activeByDefault 设置激活

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

 
 true 

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

profile配置如下:

 
  
  profile1 
   
   lilei 
   
  

  
  profile2 
   
   hanmeimei 
   
  

激活如下(支持多个):

 
 profile1 

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

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

mvn clean package –Pprofile1

当然,也可以取消激活:

mvn clean package –P!profile1

还有激活多个:

mvn clean package -Pprofile1,profile2,!profile3

4. 根据环境来激活

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



 
  profile1
  
   1.8
  
 

根据操作系统:


 
  profile1
  
   
    
    linux
    unix
    amd64
    3.19.0-30-generic
   
  
 

根据环境变量:


 
  profile1
  
   
    debug
    true
   
  
 

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


 
  profile1
  
   
    /path/to/missing/file
    /path/to/exists/file
   
  
 

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

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:


 ...
 
 
  jdbc:mysql://127.0.0.1:3306/dev
  root
  123456
 
 
  ...
  
  
   src/main/filters.properties
  
  
   
    src/main/resources
    true
   
  
  ...
 
 ...

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

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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...