Maven简介(三)——profile介绍

系统 1520 0

4        profile 介绍

4.1      profile 简介

profile 可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个 profile ,然后每个 profile 对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。比如说,我们可以通过 profile 定义在 jdk1.5 以上使用一套配置信息,在 jdk1.5 以下使用另外一套配置信息;或者有时候我们可以通过操作系统的不同来使用不同的配置信息,比如 windows 下是一套信息, linux 下又是另外一套信息,等等。具体的激活条件有哪些我在后文会讲到。

4.2      profile 的定义位置

对于使用 Maven3 ,我们可以有多个地方定义 profile 。定义的地方不同,它的作用范围也不同。

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

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

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

4.3      profile 中能定义的信息

profile 中能够定义的配置信息跟 profile 所处的位置是相关的。以下就分两种情况来讨论,一种是定义在 settings.xml 中,另一种是定义在 pom.xml 中。

4.3.1  profile定义在settings.xml中

profile 定义在 settings.xml 中时意味着该 profile 是全局的,它会对所有项目或者某一用户的所有项目都产生作用。因为它是全局的,所以在 settings.xml 中只能定义一些相对而言范围宽泛一点的配置信息,比如远程仓库等。而一些比较细致一点的需要根据项目的不同来定义的就需要定义在项目的 pom.xml 中。具体而言,能够定义在 settings.xml 中的信息有 <repositories> <pluginRepositories> <properties> 。定义在 <properties> 里面的键值对可以在 pom.xml 中使用。

4.3.2  profile定义在pom.xml中

定义在 pom.xml 中的 profile 可以定义更多的信息。主要有以下这些:

l   <repositories>

l   <pluginRepositories>

l   <dependencies>

l   <plugins>

l   <properties>

l   <dependencyManagement>

l   <distributionManagement>

l   还有 build 元素下面的子元素,主要包括:

<defaultGoal>

<resources>

<testResources>

<finalName>

4.4      profile 的激活方式

Maven 给我们提供了多种不同的 profile 激活方式。比如我们可以使用 -P 参数显示的激活一个 profile ,也可以根据环境条件的设置让它自动激活等。下面将对它们一一进行介绍:

4.4.1  使用activeByDefault设置激活

先看下面一个配置

       <profiles>
         <profile>
              <id>profileTest1</id>
              <properties>
                     <hello>world</hello>
              </properties>
              <activation>
                     <activeByDefault>true</activeByDefault>
              </activation>
         </profile>
         
         <profile>
              <id>profileTest2</id>
              <properties>
                     <hello>andy</hello>
              </properties>
         </profile>
  </profiles>


    

 

         我们可以在 profile 中的 activation 元素中指定激活条件,当没有指定条件,然后指定 activeByDefault true 的时候就表示当没有指定其他 profile 为激活状态时,该 profile 就默认会被激活。所以当我们调用 mvn package 的时候上面的 profileTest1 将会被激活,但是当我们使用 mvn package –P profileTest2 的时候将激活 profileTest2 ,而这个时候 profileTest1 将不会被激活。

4.4.2  在settings.xml中使用activeProfiles指定处于激活状态的profile

我们可以在 settings.xml 中使用 activeProfiles 来指定需要激活的 profile ,这种方式激活的 profile 将所有情况下都处于激活状态。比如现在我们定义了如下两个 profile

        <profiles>
         <profile>
              <id>profileTest1</id>
              <properties>
                     <hello>world</hello>
              </properties>
         </profile>
         
         <profile>
              <id>profileTest2</id>
              <properties>
                     <hello>andy</hello>
              </properties>
         </profile>
  </profiles>


    

 

       这里的 profile 可以是定义在 settings.xml 中的,也可以是定义在 pom.xml 中的。这个时候如果我们需要指定 profileTest1 为激活状态,那么我们就可以在 settings.xml 中定义 activeProfiles ,具体定义如下:

        <activeProfiles>
       <activeProfile>profileTest1</activeProfile>
  </activeProfiles>


    

 

       考虑这样一种情况,我们在 activeProfiles 下同时定义了多个需要激活的 profile 。这里还拿上面的 profile 定义来举例,我们定义了同时激活 profileTest1 profileTest2

        <activeProfiles>
       <activeProfile>profileTest1</activeProfile>
       <activeProfile>profileTest2</activeProfile>
  </activeProfiles>


    

 

       profileTest1 profileTest2 我们可以看出它们共同定义了属性 hello 。那么这个时候我在 pom.xml 中使用属性 hello 的时候,它到底取的哪个值呢?是根据 activeProfile 定义的顺序,后面的覆盖前面的吗?根据我的测试,答案是非也,它是根据 profile 定义的先后顺序来进行覆盖取值的,然后后面定义的会覆盖前面定义的。

4.4.3  使用-P参数显示的激活一个profile

假设我们现在有如下定义的 profiles

      <profiles>
       <profile>
              <id>profileTest1</id>
              <properties>
                     <hello>world</hello>
              </properties>
       </profile>
       <profile>
              <id>profileTest2</id>
              <properties>
                     <hello>andy</hello>
              </properties>
       </profile>
<profiles>


    

 

       那么当我们在进行 Maven 操作时就可以使用 -P 参数显示的指定当前激活的是哪一个 profile 了。比如我们需要在对项目进行打包的时候使用 id profileTest1 profile ,我们就可以这样做:

             mvn package –P profileTest1
    

 

       当我们使用 activeByDefault settings.xml 中定义了处于激活的 profile ,但是当我们在进行某些操作的时候又不想它处于激活状态,这个时候我们可以这样做:

             Mvn package –P !profileTest1
    

 

       这里假设 profileTest1 是在 settings.xml 中使用 activeProfile 标记的处于激活状态的 profile ,那么当我们使用“ -P !profile ”的时候就表示在当前操作中该 profile 将不处于激活状态。

4.4.4 根据环境来激活profile

profile 一个非常重要的特性就是它可以根据不同的环境来激活,比如说根据操作系统的不同激活不同的 profile ,也可以根据 jdk 版本的不同激活不同的 profile ,等等。

4.4.4.1 根据 jdk 来激活 profile

      <profiles>
       <profile>
              <id>profileTest1</id>
              <jdk>1.5</jdk>
       </profile>
<profiles>


    

 

       上面情况表示在 jdk 1.5 版本系列的时候激活 profileTest1

      <profiles>
       <profile>
              <id>profileTest1</id>
              <jdk>[1.4,1.7)</jdk>
       </profile>
<profiles>


    

 

       上面的情况表示在 jdk 1.4 1.5 1.6 的时候激活 profileTest1

4.4.4.2 根据操作系统来激活 profile

        <profiles>
         <profile>
              <id>profileTest1</id>
              <activation>
                <os>
                     <name>Windows XP</name>
                     <family>Windows</family>
                     <arch>x86</arch>
                     <version>5.1.2600</version>
                </os>
              </activation>
         </profile>
  </profiles>


    

 

       上面的情况就是根据操作系统的类型来激活 profileTest1

4.4.4.3 根据系统属性来激活 profile

        <profiles>
         <profile>
              <id>profileTest1</id>
              <activation>
                <property>
                     <name>hello</name>
                     <value>world</value>
                </property>
              </activation>
         </profile>
  </profiles>


    

 

上面的 profileTest1 将在提供了系统属性 hello ,并且其值为 world 的时候激活。下面的做法可以激活 profileTest1

      mvn package –Dhello=world
    

 

       当是下面的这种定义形式时, profileTest1 将在指定了系统属性 hello ,且其值为任意值的时候被激活。

        <profiles>
         <profile>
              <id>profileTest1</id>
              <activation>
                <property>
                     <name>hello</name>
                </property>
              </activation>
         </profile>
  </profiles>


    

 

4.4.4.4 根据文件是否存在激活 profile

        <profiles>
         <profile>
              <id>profileTest1</id>
              <activation>
                <file>
                     <exists>target</exists>
                </file>
              </activation>
         </profile>
  </profiles>


    

 

上面的定义表示当存在 target 文件时激活 profileTest1

        <profiles>
         <profile>
              <id>profileTest1</id>
              <activation>
                <file>
                     <missing>target</missing>
                </file>
              </activation>
         </profile>
  </profiles>


    

 

       上面的定义表示当不存在 target 文件时激活 profileTest1

4.5      查看当前处于激活状态的 profile

我们可以同时定义多个 profile ,那么在建立项目的过程中,到底激活的是哪一个 profile 呢? Maven 为我们提供了一个指令可以查看当前处于激活状态的 profile 都有哪些,这个指定就是 mvn help:active-profiles

现在假设我们的 settings.xml 文件中有如下 profile 的定义:

        <profiles>
         <profile>
              <id>profileTest1</id>
              <activation>
                <file>
                     <missing>target</missing>
                </file>
              </activation>
         </profile>
  </profiles>
  
  <activeProfiles>
       <activeProfile>profileTest1</activeProfile>
  </activeProfiles>


    

 

       这个时候我们可以看到,我们已经定义了 profileTest1 始终为激活状态,这个时候我们使用 mvn help:active-profiles 查看处于激活状态的 profile 时,就会打印出如下内容:


Maven简介(三)——profile介绍
 

Maven简介(三)——profile介绍


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论